強制スワップでOOM-killerをトリガーすることは可能ですか?


26

システムが非アクティブなページを先取りしてスワップアウトすることは可能ですか(vm.swappiness)、しかし、システムが(メモリ不足ではなく)RAMを使い果たし、スワップを強制されるときにoom-killerを呼び出しますか?

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

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

これは難しいことではないようです。X ramが使用/無料になったときにシステムがトリガーするようにoom-killerに伝えることができるようです。しかし、これが私が尋ねている理由です。知りません。

明確にするために、スワップをオフにしたり、vm.swappinessパラメーターを調整したりするつもりはありません。


3
興味深いことに、スワップファイルがない場合でも発生します。どうやら、読み取り専用メモリにマップされたファイル(実行可能ファイル、ライブラリ、おそらくグラフィックリソースなど)は代わりにスワップアウトされます。
WGH

Facebookのoomdは、システム全体のスループットに基づいてプロセスを強制終了するように設計されたユーザー空間デーモンです(つまり、スラッシング時のみ)。しかし、デスクトップ/ワークステーション(おそらくcgroupやコンテナーにタスクを配置していない)のセットアップはかなり複雑に思えます。
ジェフリーボスブーム

回答:


22

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

ただし、ユーザー空間では、何でもできます。そこで、使用可能なRAMが10%を下回ると最大のプロセス(RSSによる)を強制終了するEarly OOM Daemon(https://github.com/rfjakob/earlyoom)を作成しました。

earlyoomがなければ、http://www.unrealengine.com/html5/を数回起動することで、マシン(8GB RAM)を簡単にロックできました。現在、有罪のブラウザのタブは、物事が手に負えなくなる前に殺されます。


1
おかげで、まさに私が探していたものです。column -t -s,いくつかの巨大なcsvファイルで実行を続けearlyoom、それが不可能な場合は、無応答に気付く前にそれを強制終了させます。
henfiber

4

これは非常に複雑なソリューションのように聞こえます。私は、少量のスワップスペース(128-256MiB)を単に割り当てることをお勧めします(そして、休止状態にする必要のないセットアップしたマシンでこれを行います)。このようにして、カーネルはいくつかのページをスワップアウトできますが、OOMキラーは事態が悪化する前に呼び出されます。

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


1
私は小さなスワップを持つことは非常にエレガントなソリューションではないと主張します。基本的に、スワップの有用性を制限することになります。多くの非アクティブなページがあり、10GBのスワップを使用することでメリットが得られる場合はどうなりますか?約100GBのRAMを搭載したボックスがありますが、10GBのスワップはあまり一般的ではありません。そして、ユーザー空間でこれを行うためのアプリケーションを書くことは、(カーネルでネイティブに比べて)問題に開かれているだけです。
パトリック

そのため、「良いスワッピング」と「悪いスワッピング」を区別するメカニズムが本質的に必要であり、それは考案するのが難しいアルゴリズムだからです。適切なスワップの量は、明らかにRAMの量と実行しているワークロードによって異なります。したがって、10GiBがマシンに適している場合は、それを割り当てます:
mgorven

なぜそれが難しいのでしょうか?スワップには、によるプリエンプティブスワップとvm.swappiness、RAMの不足による強制スワップの2種類しかありません。発生する必要があるのは、カーネルがoom-killerをトリガーするためにスワップすることを強制されたときだけです。また、10ギガバイトでは、ディスクをスラッシングするための強制スワップのために大量のスペースが残されています。
パトリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.