Edited at

Linux OOM Killerについて

More than 3 years have passed since last update.


OOMとは?

Linuxは、メモリが不足してシステムが停止する恐れがある際、メモリリソースを多く消費しているプロセスを強制的に殺します。これをOOM Killerといいます。重要なプロセスでも問答無用で殺しにきます。

いるはずのプロセスがある日消えていたのなら、それはOOM Killerに殺されたのかもしれません


確認方法(CentOS)

5789のrubyのプロセスが殺されたことが分かります

$ sudo cat /var/log/messages | grep Killed

Oct 1 11:11:54 ip-xx-xx-xx-xx kernel: [1983378.957901] Killed process 5789 (ruby) total-vm:4957320kB, anon-rss:2717004kB, file-rss:0kB

Ubuntuなら/var/log/syslog


殺される可能性の高いプロセス

dstatの--top-oomオプションで簡単に候補を確認できます

これは/proc/PID/oom_scoreを見ています

$ dstat --top-oom

--out-of-memory---
kill score
mysqld 484
mysqld 484
mysqld 484


対応策

mysqldとかを殺されるとさすがに困るので、強制終了するプロセスの優先度を決めることもできます

/proc/PID/oom_adjに(優先度低)-16から+15(優先度高)の値を設定することで優先度を設定できます

また、-17を設定するとOOM Killerの対象外になります

$ cat /proc/3333/oom_score 

2000

$ echo -4 > /proc/3333/oom_adj

$ cat /proc/3333/oom_score
100


参考図書

Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック