HACK#16 OOM Killer的运行与结构
本节介绍OOM Killer的运行与结构。
Linux中的Out Of Memory(OOM)Killer功能作为确保内存的最终手段,可以在耗尽系统内存或交换区后,向进程发送信号,强制终止该进程。
这个功能即使在无法释放内存的情况下,也能够重复进行确保内存的处理过程,防止系统停滞。还可以找出过度消耗内存的进程。本节将介绍2.6内核的OOM Killer。
确认运行、日志
进行系统验证或负载试验时,有时会出现正在运行中的进程终止或者SSH连接突然断开、尝试重新登录也无法连接的情况。
这时需要查看日志。有时会输出如下内核信息。
Pid:4629,comm:stress Not tainted 2.6.26#3
Call Trace:
[<ffffffff80265a2c>]oom_kill_process+0x57/0x1dc
[<ffffffff80238855>]__capable+0x9/0x1c
[<ffffffff80265d39>]badness+0x16a/0x1a9
[<ffffffff80265f59>]out_of_memory+0x1e1/0x24b
[<ffffffff80268967>]__alloc_pages_internal+0x320/0x3c2
[<ffffffff802726cb>]handle_mm_fault+0x225/0x708
[<ffffffff8047514b>]do_page_fault+0x3b4/0x76f
[<ffffffff80473259>]error_exit+0x0/0x51
Node 0 DMA per-cpu:
CPU 0:hi:0,btch:1 usd:0
CPU 1:hi:0,btch:1 usd:0
……
Active:250206 inactive:251609 dirty:0 writeback:0 unstable:0
free:3397 slab:2889 mapped:1 pagetables:2544 bounce:0
Node 0 DMA free:8024kB min:20kB low:24kB high:28kB active:8kB inactive:180kB
present:7448kB pa
ges_scanned:308 all_unreclaimable?yes
lowmem_reserve[]:0 2003 2003 2003
……
Node 0 DMA:64kB 48kB 216kB 232kB 564kB 1128kB 3256kB 1512kB 2*1024kB
22048kB 04096k
B=8024kB
Node 0 DMA32:14kB 138kB 116kB 632kB 264kB 2128kB 1256kB 1512kB
01024kB 02048kB 1*40
96kB=5564kB
29 total pagecache pages
Swap cache:add 1630129,delete 1630129,find 2279/2761
Free swap=0kB
Total swap=2048248kB
Out of memory:kill process 2875(sshd)score 94830592 or a child
Killed process 3082(sshd)
最后出现了Out of memory(内存不足)。这就表示OOM Killer已经运行。无法重新连接的情况就是因为sshd被OOM Killer终止。如果不重新启动sshd就无法登录。
OOM Killer通过终止进程来确保空闲内存,接下来将介绍如何选定这个进程。