在 2.6.31-302 x86-64 内核上运行 Ubuntu。总体问题是我在“缓存”类别中的内存不断增加,即使我们的应用程序需要它也不会被释放或使用。
所以这就是我从“免费”命令中得到的。乍一看,这些都没有异常。
# free
total used free shared buffers cached
Mem: 7358492 5750320 1608172 0 7848 1443820
-/+ buffers/cache: 4298652 3059840
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
有人会说的第一件事是“别担心,Linux 会自动管理该内存。” 是的,我知道内存管理器应该如何工作;问题是它没有做正确的事情。此处“缓存”的 1.4 GB 似乎已保留且无法使用。
我对 Linux 的了解告诉我 3 GB 是“免费的”;但系统的行为则不然。当 1.6 GB 的实际空闲内存在使用高峰期用完时,一旦需要更多内存(并且第一列中的“空闲”接近 0),就会调用 OOM 杀手,进程被杀死,并且问题开始出现即使-/+ 缓冲区/缓存行中的“空闲”仍然有大约 1.4 GB 的“空闲”。
我已经调整了关键进程的 oom_adj 值,所以它不会使系统陷入困境,但即使如此,重要的进程也会被杀死,我们永远不想达到那个点。特别是当理论上 1.4GB 仍然是“免费的”时,如果它只会驱逐磁盘缓存。
有谁知道这里发生了什么?互联网上充斥着关于 Linux 'free' 命令和“为什么我没有任何可用内存”的愚蠢问题,因此我找不到关于这个问题的任何信息。
我脑海中浮现的第一件事是交换已关闭。我们有一个坚定不移的系统管理员;如果他们得到支持,我愿意接受解释。这会导致问题吗?
运行后这里是免费的echo 3 > /proc/sys/vm/drop_caches:
# free
total used free shared buffers cached
Mem: 7358492 5731688 …Run Code Online (Sandbox Code Playgroud) 用户数据存储在两个相当大(>1 PB)的 OpenStack Swift 存储集群上。让它们成为Cluster A和Cluster B。
此外,还有几个PoP需要与该数据进行交互。这些 PoP 中的服务器实际上是无盘的,这意味着没有用户数据存储在它们上面,也没有下载到它们。PoP 可以分为一般的世界区域(例如北美、南非、中欧等)。
一些 PoP 与任何集群的 Swift 端点相距很远,从而引入了不受欢迎的延迟。为了在一定程度上缓解这种情况,我想在每个区域中设置一个缓存网关服务器,它将缓存 r/w 请求到最近的集群。
目前,任何 PoP 中的客户端都通过永久安装的swift 虚拟文件系统访问用户数据,这是一个 FUSE 模块,将 Swift 对象存储安装为块设备(或多或少)。然而,svfs 并不是那么稳定,在未来,客户端应该通过 NFS 访问缓存服务器。
这是所需架构的一个分支的图:
+------------------+ +------------------+ NFS +------------------+
| Cluster A | SVFS | Region 1 Cache +----------> R1 PoP a Client |
| +----------------> | | |
|Persistent Storage| |Ephemeral Storage+----+ |Generates R/W Load|
+-----------------++ +------------------+ | …Run Code Online (Sandbox Code Playgroud) 我最近一直在阅读有关 SATA 驱动器的写入缓存、NCQ、固件错误、障碍等内容,但我不确定在发生电源故障时使我的数据安全的最佳设置是什么。
据我了解,NCQ 允许驱动器重新排序写入以优化性能,同时让内核了解哪些请求已被物理写入。
写入缓存使驱动器更快地处理请求,因为它不会等待数据写入物理磁盘。
我不确定 NCQ 和写入缓存如何在这里混合...
文件系统,特别是日志文件系统,需要确定何时写下特定请求。此外,用户空间进程使用 fsync() 强制刷新特定文件。在文件系统确定数据已写入磁盘之前,对 fsync() 的调用不应返回。
有一个功能(FUA,强制单元访问),我只在 SAS 驱动器上看到过,它强制驱动器绕过缓存并直接写入磁盘。对于其他一切,都有写屏障,这是内核提供的一种机制,可以触发驱动器上的缓存刷新。这会强制写下所有缓存,而不仅仅是关键数据,因此如果滥用会降低整个系统的速度,例如 fsync()。
然后有固件错误的驱动器,或者故意谎报数据何时被物理写入。
话虽如此.. 有几种方法可以设置驱动器/文件系统:A) NCQ 和写入缓存禁用 B) 仅启用 NCQ C) 仅启用写入缓存 D) 启用 NCQ 和写入缓存
我假设障碍已启用..顺便说一句,如何检查它们是否实际启用?
如果断电,在主动写入磁盘时,我的猜测是选项 B(NCQ,无缓存)对于文件系统日志和数据都是安全的。可能会有性能损失。
选项 D(NCQ+缓存),如果使用屏障或 FUA,对于使用 fsync() 的文件系统日志和应用程序是安全的。对于在缓存中等待的数据来说,这将是不利的,由文件系统来检测它(校验和),至少文件系统不会(希望)处于不稳定状态。在性能方面,它应该更好。
然而,我的问题是......我错过了什么吗?还有其他变量需要考虑吗?是否有任何工具可以确认这一点,以及我的驱动器是否正常运行?
出于基准测试的目的,我想强制 Apache 2 从磁盘加载每个请求的文件,而不是从内存中的缓存加载它。从我读过的同步开始,然后
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
让我删除 linux 的缓存。对特定文件的后续请求将不会从 linux 的缓存中提供,但对同一文件的进一步请求将再次从 linux 的缓存中提供。这是因为 /proc/sys/vm/drop_caches 不会禁用缓存,它只会丢弃在那一刻之前缓存的内容。我可能会在每个请求之前删除缓存,但我更喜欢另一种解决方案。我还能做些什么来确保 apache 从磁盘加载每个请求的文件?
我为什么要这样做:我知道在正常操作中启用了缓存。但是服务器不提供小的和经常访问的文件,例如 html 页面、小图像等。相反,它提供的文件大多是来自一个非常大的文件集的几兆字节大小的文件。这些文件的访问非常统一,因此很少访问每个单独的文件。因此,在正常操作中,我希望大多数访问不会导致缓存命中,但需要从磁盘加载文件。我有几个示例文件,我想使用 apache 的ab访问它们衡量服务器每秒能够处理多少事务的基准。不幸的是,我相信由于缓存,我得到的结果太乐观了。因此,我想禁用 Linux 的磁盘缓存,而任何缓存 Apache 可能会自行完成。
更新:到目前为止给出的答案告诉我如何禁用 Apache 自己的缓存,但我仍然想知道是否有办法禁用由 linux 内核完成的缓存。
情况是:
我正在构建 PHP 应用程序,并且需要 http 缓存。
Varnish 很棒,很多人告诉我 Varnish 将缓存数据存储在 RAM 中。但我希望它缓存在硬盘中。
有什么方法可以将 Varnish 缓存数据存储在硬盘中?
在 Azure 或 Hyper-V 下的 Windows 中,虚拟磁盘的磁盘策略写入缓存设置将始终显示为从服务器配置启用,而不管底层磁盘系统上的写入缓存设置的实际状态如何。但是,还有一个与第一个相关的第二个设置,在这种虚拟磁盘的情况下,其效果尚不清楚,其中第一个在设置中被选中/启用,但实际上在虚拟磁盘硬件中被禁用。磁盘设置如下所示:
[x] Enable Write Caching on the device
[ ] Turn off Windows write-cache buffer flushing on the device
Run Code Online (Sandbox Code Playgroud)
直观地说,我认为没有理由启用此功能,因为设备的写缓存实际上并未启用,如果它是物理磁盘,则此设置将被禁用。但是这篇文章建议启用它将使操作系统和硬件免于做无意义的工作,在保持相同数据完整性的同时提高性能,对于在设置中启用写入缓存但实际上在硬件中禁用的情况:
...由于虚拟硬盘根本不是真正的磁盘,因此就虚拟磁盘而言,该设置没有任何意义。但是第二个设置不同并且确实有意义,因为它控制磁盘的缓存刷新开/关设置。当您选择第二个设置时,缓存刷新基本上会假装成功 - 至少在软件堆栈级别。...当您在来宾操作系统中为虚拟机中的虚拟硬盘选择此设置时,您可能会看到虚拟机中运行的应用程序的性能有所提高。但请始终记住,就数据完整性而言,重要的是主机的磁盘缓存设置。
任何人都可以确认这种说法是否属实,并且是保证 WRT 数据完整性的安全措施吗?
快速 SSD(如 Intel X25-E)的每 GB 价格接近高端 RAM 的价格。那么SSD给你带来了哪些额外的优势呢?有什么特别的原因,为什么您购买 SSD,而不是仅仅在您的服务器机器中放置更多 RAM,而是将其用作 HDD 缓存甚至创建 RAM 磁盘?
编辑:我当然知道,SSD 是持久的。但磁盘缓存中的数据也是如此。从 RAM 读取必须快得多,然后从 SSD 读取。此外,SSD 的写入时间很慢,因此与 HDD 相比没有优势。特别是对于顺序写入。
EDIT2:您可以放置的 RAM 量不受限制。随着DDR3的推出,它不再是2的倍数,而是3的倍数。标准SOHO MoBos有6个插槽,而服务器主板有12个甚至令人印象深刻的18个插槽,总共支持144GB的RAM。即使您使用更具成本效益的 4GB 记忆棒,您仍然可以拥有 72GB。
我有一个 6 磁盘 raid6 mdadm 阵列,我想对写入进行基准测试:
root@ubuntu:~# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 sda[0] sdf[5] sde[4] sdd[3] sdc[2] sdb[1]
1953545984 blocks level 6, 64k chunk, algorithm 2 [6/6] [UUUUUU]
Run Code Online (Sandbox Code Playgroud)
由于缓存,基准可能不准确 - 例如,注意这里的写入速度高于应有的速度:
root@ubuntu:/mnt/raid6# dd if=/dev/zero of=delme bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.276026 s, 380 MB/s
Run Code Online (Sandbox Code Playgroud)
现在我们可以很容易地禁用每个磁盘缓存:
root@ubuntu:~# hdparm -W0 /dev/sd*
/dev/sda:
setting drive write-caching to 0 (off)
write-caching = 0 (off)
/dev/sdb:
setting drive write-caching to 0 …Run Code Online (Sandbox Code Playgroud) 是否有删除 ZFS 和 UFS 磁盘缓存的命令?(最好只有一个文件夹层次结构。)
我正在尝试调整从大量文件读取/写入数据的应用程序的性能设置。主要是读书。
在实际使用中,该应用程序只会偶尔运行一次,因此有问题的文件不太可能被缓存。
然而,由于我连续多次测试,Solaris 试图通过将此文件保留在内存中来提供帮助。
/path/to/data在基准测试运行之间,我可以指示 Solaris从其缓存中删除任何内容吗?
谢谢
我想在 Debian Jessie 生产服务器上使用 linux SSD 缓存(dm-cache 或 bcache)。(内核 3.16)
我的问题:dm-cache 和 bcache 模块在 linux 3.16 中可靠吗?我需要将内核升级到更新的版本吗?
我还发现了有关 bcache 的令人担忧的消息:https ://lkml.org/lkml/2015/12/22/154
请注意,我完全理解在可靠性和数据丢失方面意味着缓存模式选择(回写/直写)的含义,我的问题更多是关于这些模块中的软件错误
硬件:
软件:
disk-cache ×10
benchmark ×2
linux ×2
performance ×2
ssd ×2
storage ×2
apache-2.2 ×1
azure ×1
cache ×1
debian ×1
filesystems ×1
hard-drive ×1
hyper-v ×1
lvm ×1
mdadm ×1
memory ×1
memory-usage ×1
nfs ×1
openstack ×1
raid ×1
ramdisk ×1
solaris ×1
ubuntu ×1
varnish ×1
virtual-disk ×1