为什么我的x86_64系统大量地交换内存到硬盘,并且由于缺少内存而杀掉进程,但是看起来还有足够的内存?
解决方法:
AMD64被典型地配置成NUMA(Non-Uniform Memory Access)平台。这表明核心在引导的时候会构建多个内存节点,而不是单一的内存节点。这会导致一个或者多个节点在其他节点还没有耗尽内存的时候,就已经耗尽了自己的内存。当这个情况发生的时候,系统会:
1. 在内存耗尽的节点上交换内存,虽然其他节点还有大量的空闲内存,这会导致整体性能降低。
2. OOM(Out Of Memory)会杀掉进程,虽然其他节点还有大量的空闲内存。
3. 运行在已经耗尽内存节点上的进程会在一个或者多个其他节点上分配内存,这会导致过多的占用内存带宽,使得性能下降。
指示:
在x86_64 NUMA系统上,当一个或者多个节点内存耗尽,但是其他节点还有大量空闲内存时,发生的OOM杀掉进程的事件可以被核心探测到。当核心探测到这种情况,会在控制台写入这些消息:
OOM kill occurred on an x86_64 numa system! The numa=off boot option might help avoid this.
解决方法:
添加"numa=off"到/boot/grub/grub.conf的引导命令行,这样系统不会在引导时建立单独的内存区域,从而消除一个或者多个区域在其他区域之前耗尽的可能性。
比如:
title Red Hat Enterprise Linux AS (2.4.21-37.EL)
root (hd0,0)
kernel /vmlinuz-2.4.21-37.EL ro root=LABEL=/ numa=off
initrd /initrd-2.4.21-37.EL.img