Armadilloフォーラム

oom-killerの対策

seri

2019年4月18日 10時02分

お世話になります。

Linux初心者のため、何をどうしたらよいか困っています。
プログラムを24時間連続運転で何日も動作させている時に、以下のようなメッセージが出力され、機能が停止してしまいました。

invoked oom-killer: gfp_mask=0xd0, order=2, oom_adj=0, oom_score_adj=0

出るタイミングは不定期で、出る時もあれば、出ないときは全く出ません。

oomはOut of Memoryのようですが、
このメッセージがでるのは、どのような要因があるのでしょうか。
また、通常どのように対策すれば良いでしょうか?

どうぞご教示のほど宜しくお願いします。

Kernelバージョン:3.4-at5


コメント

at_mizo

2019年4月18日 11時16分

溝渕です。

> oomはOut of Memoryのようですが、
> このメッセージがでるのは、どのような要因があるのでしょうか。

メモリ枯渇が原因です。

> また、通常どのように対策すれば良いでしょうか?

ご利用のプログラムで、不要なメモリの確保または、メモリリークを疑ってみ
てください。

該当プログラムだけがoom-killerにkillされなければ良いのであれば、
oom_score_adjを調整することで回避できる可能性もあります。

詳しくはmanページをご参照ください。

[atde]$ man 5 proc
:(省略)
/proc/[pid]/oom_score_adj (Linux 2.6.36 以降)

oom_score_adjを0(never kill)に設定することは、Linuxカーネルが正常に動
作できなくなる可能性が上がる為におすすめしません。

izawa

2019年4月19日 10時57分

毎度お世話様、izawaです。

> oom_score_adjを0(never kill)に設定することは、Linuxカーネルが正常に動
> 作できなくなる可能性が上がる為におすすめしません。
とありますが、通常のプロセスは0になっているようです。

for foo in /proc/[0-9]*; do echo `cat $foo/comm` : `cat $foo/oom_score_adj`; done |sort |uniq |grep -v ' 0$'

何か勘違いされているのでしょうか。

尚、oom_score_adjを調整することは得策ではなさそうです。
http://moriwaka.blogspot.com/2016/02/oom-killer.html

そもそも質問者のseriさんの場合は、
・落ちたプロセスは何か
・他にどんなプロセスが動いているか
・関与したプロセスが自作の場合は充分テストされているか
と言ったアプローチをとるべきであり、それらを尽くした上でoom-killer対策を考えるべきだと思いますが。

at_mizo

2019年4月22日 8時56分

溝渕です。

> > oom_score_adjを0(never kill)に設定することは、Linuxカーネルが正常に動
> > 作できなくなる可能性が上がる為におすすめしません。
> とありますが、通常のプロセスは0になっているようです。

ご指摘有難うございます。上記の通りで、oom_score_adjの有効な値の範囲
は、-1000〜1000になります。