oom-killer是linux的一层内存保护机制,它会在系统内存不足的情况下杀掉一些进程。2.4 的kernel版本中是把新进来(新申请内存)的进程杀掉,而 2.6 上是杀掉占用内存最厉害的进程。oom-killer
就是一层保护机制,用于避免Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉;但这种机制因为不完善所以经常导致我们所说的“假死”。
oom工作产生的结果:
如果kill掉了应用程序,则应用不再服务。
如果kill到了sshd,此时就会出现ssh无法登录,却能ping通。
如果kill到了某些系统进程,那么可能就会导致系统挂掉了。
据我观察,可能的一种规律是1.kill user thread 2.kill root thread 3.kill system thread 逐渐进行,换句话说:oom-killer 不会立刻kill核心态中的thread。
在网上摘录了DMA LOWMem HighMem
在 32 位CPU 架构下寻址是有限制的。Linux 内核定义了三个区域:
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
LowMem 区(也叫 NORMAL ZONE ) 一共 880 MB,而且不能改变(除非用 hugemem
内核)。对于高负载的系统,就可能因为 LowMem 利用不好而引发 OOM Killer 。一个可能原因是 LowFree
太少了,另外一个原因是 LowMem 里都是碎片,请求不到连续的内存区域【根据我遇到的一个案例,一个猜想是
有些应用一次性请求比较大的内存,恰恰又是 880M 之内的,空闲的(LowFree)不够大,就会触发 OOM Killer 出来干活】。
在/proc/meminfo可查看到所有相关信息。
检查LowMem内存碎片:cat /proc/buddyinfo
oom-killer的关闭与激活方式:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1" > /proc/sys/vm/oom-kill
觉得还是不能把这层保护机制停用,那有总得要为预防系统假死或崩溃(在尝试中)
如果可以的是否可这样做:
提高核心进程或核心服务的权值,减低oom-killer杀死他们的机会。
把核心服务或核心进程退出oom-killer的监视范围。
如文档所说:
To facilitate control the behavior of the OOM killer, the
/proc/
/oom_adj knob was introduced to save important
processes in the system from being killed, and define an order of
processes to be killed. The possible values of oom_adj range from -17 to
+15.(default is 0). The higher the score, more likely the associated
process is to be killed by OOM-killer. If oom_adj is set to -17, the
process is not considered for OOM-killing.
一些日志:
Mem-info:
Node 0 DMA per-cpu:
cpu 0 hot: high 0, batch 1 used:0
cpu 0 cold: high 0, batch 1 used:0
cpu 1 hot: high 0, batch 1 used:0
cpu 1 cold: high 0, batch 1 used:0
cpu 2 hot: high 0, batch 1 used:0
cpu 2 cold: high 0, batch 1 used:0
cpu 3 hot: high 0, batch 1 used:0
cpu 3 cold: high 0, batch 1 used:0
Node 0 DMA32 per-cpu:
cpu 0 hot: high 186, batch 31 used:150
cpu 0 cold: high 62, batch 15 used:57
cpu 1 hot: high 186, batch 31 used:66
cpu 1 cold: high 62, batch 15 used:59
cpu 2 hot: high 186, batch 31 used:63
cpu 2 cold: high 62, batch 15 used:27
cpu 3 hot: high 186, batch 31 used:166
cpu 3 cold: high 62, batch 15 used:14
Node 0 Normal per-cpu: empty
Node 0 HighMem per-cpu: empty
Free pages: 9020kB (0kB HighMem)
Active:383214 inactive:372869 dirty:0 writeback:0 unstable:0 free:2255 slab:3657 mapped-file:1 mapped-anon:756660 pagetables:4127
Node 0 DMA free:2016kB min:20kB low:24kB high:28kB active:0kB inactive:0kB present:10560kB pages_scanned:0 all_unreclaimable? yes
lowmem_reserve[]: 0 3014 3014 3014
Node 0 DMA32 free:7004kB min:7012kB low:8764kB high:10516kB active:1532856kB inactive:1491476kB present:3086496kB pages_scanned:5014141 all_unreclaimable? yes
lowmem_reserve[]: 0 0 0 0
Node 0 Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
Node 0 HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
Node 0 DMA: 6*4kB 5*8kB 4*16kB 3*32kB 2*64kB 1*128kB 2*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 2016kB
Node 0 DMA32: 19*4kB 8*8kB 3*16kB 1*32kB 2*64kB 0*128kB 0*256kB 1*512kB 0*1024kB 1*2048kB 1*4096kB = 7004kB
Node 0 Normal: empty
Node 0 HighMem: empty
90 pagecache pages
Swap cache: add 10561264, delete 10561265, find 18518938/18588712, race 10+662
Free swap = 0kB
Total swap = 2096472kB
Free swap: 0kB
786432 pages of RAM
13830 reserved pages
1165 pages shared
0 pages swap cached
Out of memory: Killed process 331 (java).
阅读(2124) | 评论(0) | 转发(0) |