OOM初识
1、基本概念
Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。当物理内存和交换空间都被用完时,如果还有进程来申请内存,内核将触发OOM killer。
2、查看日志
OOM日志存放在/var/log/messages日志中,当日志中出现"Out of memory"时,即相关进程发生OOM。
grep "Out of memory" /var/log/messages
3、相关文件
1)与进程相关文件
[[email protected]_0_11_centos 1200]# ll | grep -i oom
-rw-r--r-- 1 root root 0 Dec 17 00:22 oom_adj
-r--r--r-- 1 root root 0 Dec 17 00:22 oom_score
-rw-r--r-- 1 root root 0 Dec 17 00:22 oom_score_adj
[[email protected]_0_11_centos 1200]# pwd
/proc/1200
[[email protected]_0_11_centos 1200]#
[[email protected]_0_11_centos 1200]# cat oom_adj
0
[root[email protected]_0_11_centos 1200]# cat oom_score
4
[[email protected]_0_11_centos 1200]# cat oom_score_adj
0
[[email protected]_0_11_centos 1200]#
[[email protected]_0_11_centos vm]# ll | grep oom
-rw-r--r-- 1 root root 0 Dec 17 00:35 oom_dump_tasks
-rw-r--r-- 1 root root 0 Dec 17 00:35 oom_kill_allocating_task
-rw-r--r-- 1 root root 0 Dec 17 00:35 panic_on_oom
[[email protected]_0_11_centos vm]#
[[email protected]_0_11_centos vm]# cat oom_dump_tasks
1
[[email protected]_0_11_centos vm]# cat oom_kill_allocating_task
0
[[email protected]_0_11_centos vm]# cat panic_on_oom
0
[[email protected]_0_11_centos vm]#
2) 各文件含义
oom_adj:该pid进程被oom killer杀掉的权重,介于 [-17,15]之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。
oom_score:当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算后的结果,是oom_killer的主要参考。
oom_dump_tasks:oom_dump_tasks为1,且系统的rlimit中设置了core文件大小,将会由/proc/sys/kernel/core_pattern里面指定的程序生成core dump文件。
oom_kill_allocating_task:oom_kill_allocating_task为1,那么内核将kill掉当前申请内存的进程,oom_kill_allocating_task为0,内核将检查每个进程的分数,分数最高的进程将被kill掉
panic_on_oom:0/1/2,表示OOM后系统会不会panic,2一定panic,1可能panic,0不会panic;
4、修改文件
1)命令修改(重启后失效)
[[email protected]_0_11_centos vm]# sysctl -a | grep panic_on_oom
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.panic_on_oom = 0
[[email protected]_0_11_centos vm]# sysctl vm.panic_on_oom=1
vm.panic_on_oom = 1
[[email protected]_0_11_centos vm]# sysctl -a | grep panic_on_oom
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.panic_on_oom = 1
[[email protected]_0_11_centos vm]#
2)修改文件(重启不失效)
[[email protected]_0_11_centos vm]# vim /proc/sys/vm/panic_on_oom
上一篇: Linux查看端口