TIPS/Linux/kernel/OutOfMemory

Last-modified: 2006-12-23 (土) 17:10:02

Out Of Memory はメモリ不足で、swap領域もどうしようにも当てられないときに
設定により、OOMkillerが適当な(ある規則でポイントの高い)プロセスを殺すときに出力する

そもそもこの「どうしようもない状態」で、mallocされると発生する模様
mallocが飛んでもない値を返す場合がある。

メモリリークや著しくメモリ使用量を制限した
システムの場合...

Linuxは楽観的メモリ配置戦略を用いている。
これは、 malloc() が NULLでない値を返したとき、メモリが実際に利用可能であることが保証されないこ
とを意味している。
システムがメモリ不足状態になったとき、悪名高いメ
モリ不足解決器 (OOM killer) によって一つまた
は複数のプロセスが削除される。
突然あるプロセスが削除されるのが望ましくない状況で使用されていて、しかもカーネルのバージョンが十分に最近のものであれば、このメモリを割り当て過ぎる動作 (overcommitting behavior) を以下のコマンドで無効にできる。

   # echo 2 > /proc/sys/vm/overcommit_memory

man malloc参照

ということで、メモリリークとかの場合にアロケータ
の不足解消でプロセスが殺されるんですね...

つまり、発生の頻度によって異なると思います。

・とおりすが・・りさんのような場合
sarやTopコマンドでメモリ状態を調べ、かつかつな状態
ならswap onでswap領域を増やす手をとる。

・頻度が少ない場合
バグなら頻度は少ないでしょうから、straceで確認し、
報告するなどの対処ですね。

しかし、アロケータにプロセス殺させるようなシグナル
出させないで欲しいな。

http://www.turbolinux.co.jp/dcforum/DCForumID11/5561.html

 メモリー使いすぎると、てきとーなプロセスをkillする仕様は未だ健在かー

oom-killer: gfp_mask=0x1d2

Out of Memory: Killed process 14740 (allphone).

追記

http://d.hatena.ne.jp/futsu-9/20060601/p2 から、「/proc/sys/vm/overcommit_memoryを2に変えればOOMが動くことなくmalloc(3)に失敗するという挙動になる(はず)」という話。

ほんとだ。つーかデフォルトをこっちにするべきじゃないか?

FATAL_ERROR: "ckd_alloc.c", line 108: calloc(102400,24) failed from s3_allphone.c(566)

http://d.hatena.ne.jp/futsu-9/20060601/p2

http://mkosaki.blog46.fc2.com/blog-entry-280.html

/proc/sys/vm/overcommit_memory
についてはここが一番詳しい
http://d.hatena.ne.jp/yupo5656/20040624/p1
/usr/src/linux/Documentations/vm/overcommit-accounting
にovercommit-accountingの機能が書いてある
もしくはJFのこちらを参照
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/sysctl/vm.txt.html