OOMキラーが機能していませんか?


41

私の理解では、システムに空きメモリがなくなると、カーネルはプロセスを強制終了してメモリを回復します。しかし、私のシステムでは、これはまったく起こりません。

システムで使用可能なメモリ(たとえば、数百万の文字列を含む配列)よりもはるかに多くのメモリを割り当てる単純なスクリプトを想定します。このようなスクリプトを(通常のユーザーとして)実行すると、システムが完全にフリーズするまですべてのメモリが取得されます(SysRQ REISUBのみが機能します)。

ここで奇妙な部分は、スワップパーティションがマウントされているかどうかに関係なく、コンピューターがフリーズすると、ハードドライブのLEDがオンになり、コンピューターが再起動されるまでそのままの状態が続くことです。

だから私の質問は:

  1. この動作は正常ですか?通常のユーザーとして実行されたアプリケーションがこのようにシステムをクラッシュさせる可能性があるのは奇妙です...
  2. Ubuntuがメモリを大量に(または最大に)取得したときにそれらのアプリケーションを自動的に強制終了させる方法はありますか?

追加情報

  • Ubuntu 12.04.3
  • カーネル3.5.0-44
  • RAM:4GBから〜3.7GB(グラフィックカードと共有)。*

    $ tail -n+1 /proc/sys/vm/overcommit_*
    ==> /proc/sys/vm/overcommit_memory <==
    0
    
    ==> /proc/sys/vm/overcommit_ratio <==
    50
    
    $ cat /proc/swaps
    Filename                Type        Size    Used    Priority
    /dev/dm-1                               partition   4194300 344696  -1
    

なぜ機能しないのか分かりません。tail -n+1 /proc/sys/vm/overcommit_*出力を試して追加してください。また、ここを参照してください:どのように私はconfigureコンOOMキラー

それでは、スワップ領域で何が起きているのでしょうか?#vmstat 1 100などのvmstat出力を投稿できますか?また、cat / etc / fstabを表示します。一定量のメモリ使用量が発生した場合、swapへの書き込みを開始する必要があります。メモリとスワップ領域が「いっぱい」になるまで、プロセスの強制終了は発生しません。
j0h

#swapon -a
j0h 14年

@ j0hスワップを使用すると、うまくいくようです(しばらくすると、プロセスはのようなものでクラッシュしましたAllocation failed)。しかし、スワップなしでは、コンピューターがフリーズするだけです。この方法で動作するはずです(swapを使用する場合にのみkill)?
セーラム14年

2
SysRqを持つあなたはまた、(IIRC SysRqを+ F)OOM呼び出すことができます
Lekensteyn

回答:


36

公式/proc/sys/vm/*ドキュメントから:

oom_kill_allocating_task

これにより、メモリ不足の状況でOOMトリガータスクを強制終了できます。

これがゼロに設定されている場合、OOMキラーはタスクリスト全体をスキャンし、ヒューリスティックに基づいて殺すタスクを選択します。これは通常、強制終了時に大量のメモリを解放する不正なメモリ占有タスクを選択します。

これがゼロ以外に設定されている場合、OOMキラーはメモリ不足状態を引き起こしたタスクを強制終了します。これにより、高価なタスクリストスキャンが回避されます。

panic_on_oomが選択されている場合、oom_kill_allocating_taskで使用される値よりも優先されます。

デフォルト値は0です。

要約すると、を設定oom_kill_allocating_taskすると1、システムをスキャンして強制終了するプロセスを探しますが、これは高価で時間がかかるタスクであり、カーネルはシステムのメモリ不足を引き起こしたプロセスを強制終了します。

私自身の経験から、OOMがトリガーされると、カーネルにはそのようなスキャンを実行するのに十分な「強度」がなくなり、システムがまったく使用できなくなります。

また、問題の原因となったタスクを強制終了するだけの方が明らかになるため0、デフォルトで設定されている理由を理解できません。

テストのため/proc/sys/vm/に、次の再起動時に元に戻す適切な擬似ファイルに書き込むことができます。

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

永続的な修正/etc/sysctl.confを行う/etc/sysctl.d/には、.conf拡張子を付けて、/etc/sysctl.d/local.confたとえば、以下の新しいファイルに以下を書き込みます:

vm.oom_kill_allocating_task = 1

2
Ubuntuでは常に0に設定されていましたか?以前は自動的に強制終了していましたが、いくつかのバージョン以降は強制終了しなかったためです。
スケリット14年

1
@skeritこれはよくわかりませんが、2010年に使用したカーネル(Debian、Liquorix、GRML)では0に設定されていました。
テレサeジュニア

「また、問題の原因となったタスクを強制終了するだけの方が明らかになるので0、デフォルトで設定されている理由を理解できません。」-メモリを要求したプロセスは、必ずしも「問題を引き起こした」プロセスではないためです。プロセスAがシステムのメモリの99%を占有​​し、0.9%を使用しているプロセスBが不運によってOOMキラーをトリガーする場合、Bは「問題の原因」ではなく、意味がありませんkillB。ポリシーにより、まったく問題のない低メモリプロセスが、別のプロセスの暴走したメモリ使用のために偶然に強制終了されるリスクがあります。
マークアメリー

1
@MarkAmery本当の問題は、Linuxが必要なプロセスを単に殺すのではなくvm.admin_reserve_kbytes、たとえば128 MBに増やしたとしても、遅延のようにスラッシングを開始することです。設定vm.oom_kill_allocating_task = 1は問題を軽減するように見えますが、実際にはそれを解決しません(デフォルトでは、Ubuntuはすでにフォーク爆弾を処理しています)。
テレサeジュニア

1
たぶんもっとエレガントsudo sysctl -w vm.oom_kill_allocating_task=1
パブロA

9

更新:バグが修正されました。

テレサの答えは問題を回避するのに十分であり、良いです。

さらに、バグ報告を提出ました。これは間違いなく壊れた動作だからです。


なぜあなたが投票されたのかはわかりませんが、それはカーネルのバグのようにも思えます。今日、大学の大規模なサーバーをクラッシュさせ、数週間実行されていたいくつかのプロセスを強制終了しました...そのバグレポートを提出してくれてありがとう!
shapecatcher

7
2014年に修正される可能性があり、2018年(および18.04)にOOMキラーは再び何もしません。
スケリット

0

Earlyoomを試すことができます。これは、ユーザー空間で動作し、OOM状況で最大のプロセスを殺そうとするOOMキラーです。


-1

まず、13.10への更新(クリーンインストール、データの保存)をお勧めします。

更新したくない場合は、vm.swappinessを10に変更し、RAMに問題がある場合はzRAMをインストールします。


2
私はあなたを支持した人ではありませんでしたが、一般に、vm.swappiness低メモリの問題に苦しんでいるシステムでは、下げることは良いことよりも害をもたらします。
テレサeジュニア14年

RAMを最初に圧縮してから、ディスクの使用を避けることは避けてください。ディスクの使用はずっと遅く、コンピューターがフリーズする可能性があります。
ブラスク14年

理論的には、zRAMは良いことですが、CPUを大量に消費するため、一般的にコストに見合う価値はありません。メモリは一般に電気よりもはるかに安価です。そして、RAMのアップグレードがより高価なラップトップでは、CPUの使用はほとんど望ましくありません。
テレサeジュニア14年

彼が求めているのは、より安定したシステムzRAMを持ち、swapnessを変更するとシステムがより多くのCPUリソースを使用するようにすることですが、atmに制限があり、エラーが発生するのはメモリです。 zRAMをインストールすると何が起こるのか。
ブラスク14年

彼の質問から、彼が必要以上に多く食べる不適切なスクリプトを書いている可能性があることは明らかです(そして、私はすでに自分でこれを行っています)。このような状況では、数秒でギガバイトのRAMを取得するスクリプトを見ることができます。スクリプトが十分に満たされることはないため、zRAMは助けにはなりません。
テレサeジュニア14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.