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通过终止进程来确保空闲内存,接下来将介绍如何选定这个进程。