Linux 页面缓存会减慢 64GB 内存双 CPU 服务器上的 IO

use*_*392 4 linux memory io dd

我的 linux 页面缓存有一个很大的问题,这会减慢 IO。例如,如果我使用 dd 复制一个 lvm 分区,linux 会将数据缓存在缓冲区或缓存中 (free –m)。那不是问题,但是在缓冲区达到特殊值后,复制过程停止并减慢到几 mbs 甚至 kbs。我已经做了很多写入磁盘或 /dev/null 的测试,问题与源驱动器或目标无关。

详细:

  • 有两个几乎相同的服务器。两者都使用相同的内核运行 CentOS 6.5。它们具有相同的磁盘、相同的设置、相同的其他硬件,在所有方面都相同。唯一的区别是一台服务器有 2 个 CPU 和 64GB 内存,而另一台服务器有 1 个 CPU 和 32 GB 内存。
  • 这里也是以下复制过程的图像:http : //i.stack.imgur.com/tYlym.jpg
  • 这里还有一个带有 meminfo 的新版本。meminfo 来自不同的运行,因此值不是相同的,但它是完全相同的行为:http ://i.stack.imgur.com/4SIJG.jpg
  • 使用 dd 或其他文件系统复制程序开始复制。
  • 缓冲区或缓存开始填满。一切都很好。
  • 缓冲区或缓存达到最大数量(在 64GB ram 服务器上,值为 32GB 或 17GB;在 32GB ram 服务器上所有可用内存)
  • 在 64GB ram 服务器上,复制过程现在停止或仅限于几 mbs。在 32GB 内存服务器上一切正常。
  • 在 64GB ram 服务器上,我可以通过使用“sync; echo 3 > /proc/sys/vm/drop_caches”强制缓存来暂时解决问题。但是当然缓冲区开始立即再次增长并且问题再次发生。

结论:

问题要么与第二个 cpu 有关,要么与内存总量有关。我有一种“感觉”,问题可能是,每个 cpu 都有自己的 32GB ram,并且复制过程仅在 cpu 上运行。所以最后复制过程将缓冲区/缓存增加到近 32GB 或其他 cpu 未使用的内存,然后 linux 认为嘿还有内存所以让我们进一步增加缓冲区但下面的硬件无法访问内存,或其他什么像那样。

有人有想法或解决方案吗?当然我可以将 dd 与直接标志一起使用,但这并不能解决问题,因为还有通过 samba 等进行的外部访问。

编辑1:

这里还有来自 64GB ram 服务器的 /proc/zoneinfo:1. http://pastebin.com/uSnpQbeD(在 dd 开始之前) 2. http://pastebin.com/18YVTfdb(当 dd 停止工作时)

编辑2:

  • 虚拟机设置:http : //pastebin.com/U9E9KkFS
  • /proc/sys/vm/zone_reclaim_mode 位于 32 GB ram 服务器 0 和 64 GB ram 服务器 1 上。我从未接触过这个值。安装程序设置这些。我临时将其更改为 0 并重试测试。现在所有内存都用于缓冲区和缓存。所以它看起来很棒,就像其他服务器一样。但随后它立即开始全速交换......我将交换率设置为 0。这有帮助,但它仍然每秒交换几 mb。它每秒都会增加缓冲区。所以它不交换缓冲区,它交换虚拟机的内存以获得更多内存来增加缓冲区......疯狂。但也许这是正常的!?

编辑3:

/proc/buddyinfo 和 numactl --hardware:http ://pastebin.com/0PmXxxin

最后结果

  • /proc/sys/vm/zone_reclaim_mode 肯定是技术上的正确方式,但机器在它之后并没有很好地工作。例如:如果我复制一个磁盘 linux 现在使用 100% 的空闲内存到缓冲区(不像以前那样只有 XGB 然后停止)。但是在最后一个空闲内存被用来缓冲的时候,linux开始交换vm内存并增加缓冲区和缓存的总量。我的系统通常不需要交换,因此交换内存与某些虚拟机位于同一磁盘上。结果,如果对这些 vm 进行备份,linux 会在我从磁盘读取备份的同时写入交换。所以交换虚拟机是不好的,但更糟糕的是 linux 破坏了我的备份读取速度......所以将 /proc/sys/vm/zone_reclaim_mode 设置为 0 并不能解决全部问题......目前我在一个筛选一个每 10 秒同步和刷新一次缓存的脚本... 不好,但对我来说效果更好。我的系统上没有网络服务器或普通文件服务器。我只运行 vms,通过 samba 进行备份和存储备份。我不喜欢这个解决方案。

Mat*_*Ife 5

您看到的行为是由于 Linux 在 NUMA 系统上分配内存的方式造成的。

我假设(不知道)32GB 系统是非 numa,或者 numa 不足以让 Linux 关心。

如何处理 numa 的行为由/proc/sys/vm/zone_reclaim_mode选项决定。默认情况下,linux 会检测你是否使用了 numa 系统,如果觉得它会提供更好的性能,则更改回收标志。

内存被分成多个区域,在 numa 系统中,第一个 CPU 插槽有一个区域,第二个 CPU 插槽有一个区域。这些出现为node0node1。如果你养猫,你可以看到它们/proc/buddyinfo

当区域回收模式设置为 1 时,从第一个 CPU 插槽分配将导致在与该 CPU 关联的内存区域上发生回收,这是因为从本地 numa 节点回收在性能方面效率更高。从这个意义上说,回收是丢弃页面,例如清除缓存或交换该节点上的内容。

将该值设置为 0 会导致在区域填满时不会发生回收,而是将内存分配到外部 numa 区域中。这是以另一个 CPU 的 breif 锁定为代价来获得对该内存区域的独占访问。

但随后它立即开始交换!几秒后:内存:总共 66004536k,已使用 65733796k,可用 270740k,34250384k 缓冲区交换:总共 10239992k,已使用 1178820k,9061172k 可用,9138k

交换行为和交换时间由几个因素决定,其中之一是已分配给应用程序的页面的活跃程度。如果它们不是很活跃,它们将被交换以支持缓存中发生的更繁忙的工作。我假设您的虚拟机中的页面不会经常被激活。