4

すべてのoom関連機能を無効にしたとします(OOMキラーはありません)。プロセスが使用可能なメモリをすべて占有し、どのページ キャッシュにもない mmap されたディスク ファイルから数バイトを読み取ろうとしています。このプロセスは OOM シグナルを受け取るので、反応的にメモリを解放して後で再試行できますか?

4

2 に答える 2

0

それは多くの条件に依存します。

1) どのように oom-killer を無効にしますか?

/proc/sys/vm/overcommit_memory に 2 を書き込むとします。これは次のことを意味します。

2: 常にチェックし、オーバーコミットしない (man 5 proc を参照)

その後、mmap を呼び出しました。

2)「mmap」で使用するフラグは何ですか?

MAP_NORESERVE を使用するとします。別のケース (MAP_NORESERVE なし) では、十分な物理メモリがない場合、mmap は単にエラーを返します。

3) overcommit_ratio の値は? ゼロでない場合、mmap はエラーを返します。「ファイルのページがない」という状況にはなり得ません。

これらの仮定がすべて真である場合、次のようになります: mm/oom_kill.c::pagefault_out_of_memory,

そして再び新しい状態:

4) 私たちは oom disable の cgroup にいるのでしょうか?

はいの場合は、寝るだけです。

そして最後に oom-killer が呼び出されます

無効化について

そして、「私たちはただ眠りにつく」とは、システムの一時停止を意味しますか?

linux-source/Documentation/cgroups/memory.txt を参照してください:

OOM-killer が無効になっている場合、cgroup の下のタスクは、アカウンタブル メモリを要求すると、メモリ cgroup の OOM-waitqueue でハング/スリープします。

そのため、すべてのシステムではなく、無効化された oom-killer を持つ cgroup の一部のプロセスがスリープ状態になります。

ユーザーランドプロセスがこのページフォールトを処理することは可能ですか?

1)これを行うことが可能です: https://lwn.net/Articles/550555/

2) または、単に oom-killer イベントを視聴することもできます。

linux-source/Documentation/cgroups/memory.txt を再度参照してください。

memory.oom_control ファイルは、OOM 通知およびその他の制御用です。

メモリ cgroup は、cgroup 通知 API を使用して OOM 通知機能を実装します (cgroups.txt を参照)。複数の OOM 通知配信を登録し、OOM が発生したときに通知を受け取ることができます。

ノーティファイアを登録するには、アプリケーションは次のことを行う必要があります:...

于 2015-05-03T09:59:37.680 に答える
0

を無効にしたoom-killer場合、プロセスはシグナルを受信しませんがmalloc()、メモリが使い果たされると呼び出しは失敗します。

于 2015-05-03T08:41:26.070 に答える