Linux页面caching使用64GB RAM的双CPU服务器上的IO速度变慢

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

详细:

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

结论:

这个问题要么与第二个CPU有关,要么与内存总量有关。 我有“感觉”这个问题,每个CPU都有自己的32GB内存,复制过程只在CPU上运行。 所以最后复制过程中缓冲区/caching近32GB或其他CPU未使用的内存,然后Linux认为嘿仍有内存,所以让我们进一步增加缓冲区,但硬件下面不能访问内存,或东西像那样。

有没有人有一个想法或解决scheme? 当然,我可以使用dd直接标志,但是这不解决问题,因为也有外部访问通过桑巴等。

EDIT1:

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

EDIT2:

  • 虚拟机设置: http : //pastebin.com/U9E9KkFS
  • / proc / sys / vm / zone_reclaim_mode位于32 GB ram服务器0和64 GB ram服务器1上。我从不触及此值。 安装程序设置这些。 我临时把它改为0,然后重试testing。 现在所有的内存都用于缓冲区和caching。 所以它看起来很棒,和其他服务器一样。 但是,它立即开始全速交换…我把交换为0。这有助于,但它仍然交换几个每英寸MB。 并且每隔一段时间增加一次缓冲区。 所以它不交换缓冲区,它交换vms的内存来获得更多的内存来增加缓冲区…疯狂。 但也许这是正常的!?

EDIT3:

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

最后结果

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

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

我假设(不知道)32GB系统是非numa,或不numa足够的Linux照顾。

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

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

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

将该值设置为0将导致如果区域填满,则不会发生回收,而是将其分配到内存的外部numa区域。 这是为了获得对该内存区域的独占访问而牺牲另一个CPU的安全性。

但是,它立即开始交换! 几分钟后:Mem:66004536k total,65733796k used,270740k free,34250384k buffers交换次数:10239992k total,1178820k used,9061172k free,91388k cached

交换行为和交换时间由几个因素决定,一个是页面被分配给应用程序的活动程度。 如果他们不是非常活跃,他们将被换成caching中发生的繁忙工作。 我假设你的虚拟机中的页面不经常被激活。