我有一个Linux页面caching,这减慢了IO的巨大问题。 例如,如果我用dd复制lvm分区,linux会将数据caching在缓冲区或caching中(free -m)。 这不是问题,但在缓冲区达到特殊值后,复制过程将停止并减慢到几个mbs或甚至kbs。 我已经做了很多testing,写入磁盘或/ dev / null的问题与源驱动器或目的地无关。
详细:
结论:
这个问题要么与第二个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:
EDIT3:
/ proc / buddyinfo和numactl –hardware: http ://pastebin.com/0PmXxxin
最后结果
您看到的行为是由于Linux在NUMA系统上分配内存的方式。
我假设(不知道)32GB系统是非numa,或不numa足够的Linux照顾。
如何处理numa的行为是由/proc/sys/vm/zone_reclaim_mode
选项指定的。 默认情况下,linux会检测你是否正在使用一个numa系统,如果觉得它会提供更好的性能,则更改回收标志。
内存分成区域,在numa系统中,第一个CPU插槽有一个区域,第二个区域有一个区域。 这些是node0
和node1
。 你可以看到他们,如果你猫/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中发生的繁忙工作。 我假设你的虚拟机中的页面不经常被激活。