オーバーコミットがないと、ほとんどのページで書き込み中にコピーがまったく発生しなくても、各fork()にはアドレス空間をコピーするのに十分な空き容量が必要です。
上記の説明は、Robert Loveの著書(Linuxシステムプログラミング第2版、メモリ管理の章、オーバーコミット、およびOOMのトピック)から抜粋したものです。
スワップをオフにするとメインメモリをオーバーコミットできません。この場合、書き込み中のコピー(fork、malloc、mmapなど)はメインメモリで実行されますか、それとも遅延割り当てメカニズムなしでメモリにデータ全体を事前割り当てしようとしますか?
欠けている部分があれば修正してください。
更新:友達の皆さん、最初は取引所を閉じれば無理しないと思いました。以下の説明で述べたように、スワップを解除してもオーバーコミットできます。
答え1
交換せずに過剰に使用できます。 Robert Loveの本では、「ストレージ」という言葉は、この文脈で物理的なRAMを表します。カーネルはまだ物理RAMへのマッピングまたは書き込み中のコピーの場合、共有ページフレームへのポインタを含まないプロセス用のメモリスペースを設定します。ページにアクセスすると、要求に応じてマッピングが生成されます。すべてのマッピングが同時に必要ではないと仮定するため、過剰なコミットは比較的安全です。
答え2
これは良い記事です:鍵 - 乱用
/proc/sys/vm/
実際には、ファイル構成に応じてデフォルトのメモリ制限があります。 「No Overcommit」に設定してパーセントを選択すると、次のような結果が得られます。
Memory Allocation Limit = Swap Space + RAM * (Overcommit Ratio / 100)
デフォルトの割合は50(%)で、4G RAMと4Gスワップの場合、割り当て制限は6Gです。
この特別な「過剰禁止」モードでは(経由/proc/sys/vm/overcommit_memory
)過度にコミットする積極的に使用されると予想されるスワップ空間の量を意味します。 8 GB を割り当てて使用すると、速度が遅すぎるため、これは意味があります。したがって、スワップ空間は半分に「計算」される。
RAMサイズを厳密に制限して交換したくない場合は、overcommit_memoryを2(=オーバーコミットなし)に設定し、overcommit_ratioを100%に設定できます。
デフォルトではカーネルするいくつかの確認:
経験的なアルゴリズムを適用して、十分なメモリがあることを確認します。
(3番目のモードは、OOMが発生するまで確認しない、つまりオーバーコミットです。)