欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OOM初识

程序员文章站 2022-04-29 19:59:30
...

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专栏