use*_*392 4 linux memory io dd
我的 linux 页面缓存有一个很大的问题,这会减慢 IO。例如,如果我使用 dd 复制一个 lvm 分区,linux 会将数据缓存在缓冲区或缓存中 (free –m)。那不是问题,但是在缓冲区达到特殊值后,复制过程停止并减慢到几 mbs 甚至 kbs。我已经做了很多写入磁盘或 /dev/null 的测试,问题与源驱动器或目标无关。
详细:
结论:
问题要么与第二个 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:
编辑3:
/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 插槽有一个区域,第二个 CPU 插槽有一个区域。这些出现为node0和node1。如果你养猫,你可以看到它们/proc/buddyinfo。
当区域回收模式设置为 1 时,从第一个 CPU 插槽分配将导致在与该 CPU 关联的内存区域上发生回收,这是因为从本地 numa 节点回收在性能方面效率更高。从这个意义上说,回收是丢弃页面,例如清除缓存或交换该节点上的内容。
将该值设置为 0 会导致在区域填满时不会发生回收,而是将内存分配到外部 numa 区域中。这是以另一个 CPU 的 breif 锁定为代价来获得对该内存区域的独占访问。
但随后它立即开始交换!几秒后:内存:总共 66004536k,已使用 65733796k,可用 270740k,34250384k 缓冲区交换:总共 10239992k,已使用 1178820k,9061172k 可用,9138k
交换行为和交换时间由几个因素决定,其中之一是已分配给应用程序的页面的活跃程度。如果它们不是很活跃,它们将被交换以支持缓存中发生的更繁忙的工作。我假设您的虚拟机中的页面不会经常被激活。