web-dev-qa-db-ja.com

LinuxでOomキラーを無効にする方法は?

私の現在の設定は次のとおりです。

> cat /proc/sys/vm/panic_on_oom
0
> cat /proc/sys/vm/oom_kill_allocating_task
0
> cat /proc/sys/vm/overcommit_memory
1

しかし、私がタスクを実行すると、とにかくそれは殺されます。

> ./test/mem.sh
Killed
> dmesg | tail -2
[24281.788131] Memory cgroup out of memory: Kill process 10565 (bash) score 1001 or sacrifice child
[24281.788133] Killed process 10565 (bash) total-vm:12601088kB, anon-rss:5242544kB, file-rss:64kB

更新

私の仕事は多くの記憶を必要とする科学計算に慣れています。overcommit_memory=1が最良の選択かもしれないようです。

アップデート2

実は、16G以上のメモリを消費するデータ分析プロジェクトに取り組んでいますが、5G程度に制限するように言われました。プロジェクトは多くのサブコマンドを使用し、それらのほとんどにはJavaのXmsXmxのようなオプションが含まれていないため、プログラム自体を最適化してこの要件を実装することは不可能な場合があります。

アップデート3

私のプロジェクト オーバーコミットされたシステムである必要があります。 a3f と正確に言うと、割り当てられたmemが失敗した場合、私のアプリはxmallocまでにクラッシュすることを好むようです。

> cat /proc/sys/vm/overcommit_memory
2
> ./test/mem.sh
./test/mem.sh: xmalloc: .././subst.c:3542: cannot allocate 1073741825 bytes (4295237632 bytes allocated)

たくさんの素晴らしいテストで疲れ果ててしまいますが、私は降伏したくありません。だから私に光への道を教えてください; )

6
Yang

OOMキラーは消えません。記憶がない場合、誰かが支払う必要があります。できることは、メモリ割り当てが失敗するまでの制限を設定することです。それがまさに_vm.overcommit_memory_から_2_への設定が達成することです。

から ドキュメント

Linuxカーネルは、次のオーバーコミット処理モードをサポートしています

2-オーバーコミットしないでください。システムの合計アドレス空間コミットは、スワップ+構成可能な量(デフォルトは50%)の物理RAMを超えることはできません。使用量にもよりますが、ほとんどの場合、これはページへのアクセス中にプロセスが強制終了されないことを意味しますが、必要に応じてメモリ割り当てでエラーを受け取ります。

通常、カーネルは仮想メモリを喜んで配布します(オーバーコミット)。ページを参照する場合にのみ、カーネルはページを実際の物理フレームにマップする必要があります。その要求を処理できない場合は、スペースを確保するためにOOMキラーによってプロセスを強制終了する必要があります。

オーバーコミットを無効にすると、たとえばカーネルが要求されたメモリ量をコミットできなかった場合、malloc(3)NULLを返します。これにより、制限はありますが、状況が少し予測可能になります(多くのアプリケーションは、必要以上に割り当てます)。

10
a3f

Oom_adjの可能な値の範囲は-17から+15です。スコアが高いほど、関連するプロセスがOOM-killerによって強制終了される可能性が高くなります。 oom_adjが-17に設定されている場合、プロセスはOOM-killingの対象とは見なされません。

ただし、RAMを増やすことをお勧めします。RAMを増やすことができない場合は、スワップメモリ​​を追加してください。

スワップメモリ​​を増やすには、 このリンク

1