web-dev-qa-db-ja.com

強制スワッピングでOOMキラーをトリガーすることは可能ですか?

システムに非アクティブなページ(vm.swappiness)ですが、システムがRAM(メモリ不足ではなく))不足し、強制的にスワップされたときにoom-killerを呼び出しますか?

主要なページフォールトが原因でシステムがディスクのスラッシングを開始したときにシステムが粉砕されて停止するのを防ぎながら、非アクティブなページがスワップアウトされるようにすることが最終的な目標です。

もう1つの要望は、oom-killerがトリガーする前にシステムが強制的に使用するスワップメモリ​​の量を設定することです。このようにして、システムがあまりにも遠くない限り、システムはスワップに少し浸ることができます。または、すべてのRAMを使用する前にoom-killerをトリガーするようにこのようなしきい値を設定して、常にファイルシステムキャッシュのための領域を確保することができます(したがって、ディスクのスラッシングの増加を回避できます)。

これはそれほど難しいことではないようです。システムにX ramが使用されている/解放されているときにトリガーするようにoom-killerに指示できるようです。しかし、これが私が求めている理由です。知りません。

説明のために、私はスワップをオフにしたり、vm.swappinessパラメータ

26
Patrick

私もその問題に苦労しました。私は、システムが何があっても応答性を維持したいだけであり、数分待つよりもプロセスを失うことを好みます。カーネルoom killerを使用してこれを実現する方法はないようです。

しかし、ユーザースペースでは、私たちがやりたいことは何でもできます。だから、私は初期のOOMデーモン( https://github.com/rfjakob/earlyoom )を書きました。これは、利用可能なRAMが10を下回ると(RSSによって)最大のプロセスを強制終了します%。

アーリールームなしでは、 http://www.unrealengine.com/html5/ を数回起動することで、私のマシン(8GB RAM)を簡単にロックすることができました。今、罪のあるブラウザのタブは手に負えなくなる前に殺されます。

22
Jakob

これは過度に複雑なソリューションのように思えます。私は、少量のスワップ領域(128-256MiB)を単に割り当てることをお勧めします(私が休止状態にする必要のないセットアップしたマシンでこれを行います)。このようにして、カーネルは一部のページをスワップアウトできますが、問題が発生する前にOOMキラーが呼び出されます。

本当にこれを実行したい場合は、スワップの使用状況を監視し、 Magic SysReq key を使用してOOM-killerを呼び出す独自のスクリプト/プログラムを作成する必要があると思います(これは、プログラムで次のように記述して実行できます) /proc/sysrq-trigger)。

4
mgorven