すべてのoom関連機能を無効にしたとします(OOMキラーはありません)。プロセスが使用可能なメモリをすべて占有し、どのページ キャッシュにもない mmap されたディスク ファイルから数バイトを読み取ろうとしています。このプロセスは OOM シグナルを受け取るので、反応的にメモリを解放して後で再試行できますか?
2 に答える
それは多くの条件に依存します。
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 が発生したときに通知を受け取ることができます。
ノーティファイアを登録するには、アプリケーションは次のことを行う必要があります:...
を無効にしたoom-killer
場合、プロセスはシグナルを受信しませんがmalloc()
、メモリが使い果たされると呼び出しは失敗します。