私はman procのドキュメントを読んだ。 overcommit_memory = 0の経験的な方法は、overcommit_memoryに関してはよく理解されていません。ヒューリスティックは実際に何を意味しますか?
「MAP_NORESERVEをチェックせずにmmap(2)を呼び出す」というのは、カーネルが仮想メモリのみを割り当て、スワップスペースが存在するという事実さえ知らないという意味ですか?
このファイルにはカーネル仮想メモリ計算モデルが含まれています。値は次のとおりです。 0:経験的オーバーコミット(デフォルト) 1: 常に過度に使用し、確認しないでください。 2:頻繁に確認し、過度に投資しないでください。 モード 0 では、MAP_NORESERVE を使用する mmap(2) 呼び出しは検査されず、基本検査は非常に弱く、危険にさらされます。 プロセスを「OOM-killed」にします。
前の質問に加えて、仮想アドレス空間が使い果たされた場合、残りの物理メモリが十分であるかどうかにかかわらず、OOMが発生する可能性があるかどうかを尋ねます。
ありがとうございます。
答え1
overcommit_memory
メモリ管理サブシステムには、この設定を考慮する3つの場所があります。
主なもの
__vm_enough_memory
inmm/util.c
は、メモリ割り当てを進めるのに十分なメモリがあるかどうかを決定します(必ず呼び出されないユーティリティ関数であることに注意してください)。 1 の場合、overcommit_memory
関数は常に成功します。 2の場合は、実際に使用可能なメモリを確認してください。 0の場合は、次のような有名な経験的方法を使用します。- 利用可能なページ数の計算
- ファイルサポートページ数を追加(復元可能)
- 共有メモリに使用されるページの削除
- 交換ページを追加
- リサイクル可能なページを追加
- ページを予約するアカウント
- ルート用にいくつかのメモリ予約(
cap_sys_admin
プロセスで割り当てが行われていない場合)
結果の合計は、メモリ割り当てのためのしきい値として使用されます。
mmap
また、設定を確認してください。MAP_NORESERVE
オーバーコミットが許可されているか(モード0と1)、割り当てにバックアップスワップがないことをVM_NORESERVE
確認します。この特別なケースでは、モード0は実際にはモード1と同じです。これは「mmap(2)
確認なしの呼び出しMAP_NORESERVE
」を意味します。これはMAP_NORESERVE
mmap
、呼び出しが常に成功し、超過割り当てによってOOMキラーが介入することを意味します。実際、または書き込みを試みている間にセグメントの競合が発生します。shmem
と同様の動作をしますmmap
。
アドレス空間が不足すると、割り当ては実際には進行できないため、OOM 出口ではなく割り当て失敗が発生します。