Linuxがデフォルトでメモリをオーバーコミットするのはなぜですか?

Linuxがデフォルトでメモリをオーバーコミットするのはなぜですか?

スーパーユーザー問題関連https://superuser.com/questions/200387/linux-overcommit-memory私の質問は、彼らがデフォルトを乱用することを許可するのはなぜですか?

2.5.30に基づいて、この値は次のとおりです。 0(デフォルト):以前と同じ:超過購読がどれほど合理的かを推測し、

ベストアンサー1

Linux(および一般的なUnixシステム)では、メモリオーバーコミットの必要性の大部分は、fork()呼び出しプロセスのアドレス空間をコピーするシステム呼び出しを実装する必要があるためです。

ほとんどの場合、このシステムコールの後にはexec()2つの組み合わせがあり、現在のプロセスのサブプログラムとして別々のプログラムが生成されます。この場合、冗長アドレススペースのほとんどは使用されません。

効率を向上させるために、Linuxは書き込み中のコピーを使用して呼び出し側アプリケーションのメモリコピーを防ぎますfork()。この場合、すべてのページのコピーを防ぎ、exec()呼び出し直後にそのページを削除します。

しかし、呼び出しを行うとfork()誰かが来るかどうかはわかりませんexec()。これは子プロセスを作成するために使用される可能性が高く、親のアドレス空間を再利用することが私たちが望むものです。 (この技術は、接続を処理するために事前にフォークされたワーカープロセスを使用するデーモンで非常に広く使用されています。)この場合、フォークされた子プロセスはメモリ要件の大部分または少なくとも一部を持ちます(親プロセスメモリの100%ではないかもしれません)。しかし、ほとんどは仮定できます。)

fork()ただし、この場合のために常にメモリを予約することは+状況で問題になりますexec()。特に、親プロセスが複数のGBのメモリを予約し、多くの子プロセスをフォークする長期実行プロセスである場合は、さらにそうです。過剰コミットでない場合は、親項目と分岐した各子項目が使用する合計容量を維持する必要があります。ただし、exec()予約はすぐにフラッシュされるため、これらのいずれも実際には使用されません。その結果、これらのワークロードには多くのスワップスペース(ほとんどの予約を処理するためには使用されませんが、最悪の場合は必要です)や過剰コミットなどが必要です。

この例では要点をよく説明していますが、fork()Linux/Unixの他のAPIも過度に使用する必要があります。たとえば、malloc()呼び出されると(より正確にはそれを実装するシステムコール)、メモリはプロセスによって「タッチ」されるまで実際に割り当てられないため、非常に大きなギガバイトブロックが割り当てられ、まれに使用されます。実際には数メガバイトが使用されます。このようなAPIがこのように動作するという事実は、プログラムがこれらの属性を利用することを意味します。ない限り)。

この問題に関する興味深い議論は、fork()以下にあります。LWNが発行したMicrosoft Research関連記事。もちろん、記事自体は興味深いです。しかし、これらのコメントがどのようにすぐに乱用とそれに伴う問題につながるのかがわかります。

記事のタイトルは分かれ道()

おすすめ記事