web-dev-qa-db-ja.com

vm.overcommit_ratioの残りのメモリはどこに行きますか?

vm.overcommit_memory2に設定してメモリのオーバーコミットを無効にすると、デフォルトで、システムはスワップの次元+物理メモリの50%までメモリを割り当てることができるようになります こちら

vm.overcommit_ratioパラメータを変更して比率を変更できます。 80%に設定したとすると、物理メモリの80%が使用される可能性があります。

私の質問は:

  • 残りの20%でシステムは何をしますか?
  • そもそもなぜこのパラメータが必要なのですか?
  • 常に100%に設定すべきではないのはなぜですか?
10
Dan Tumaykin

残りの20%はシステムでどのように処理されますか?

カーネルは、残りの物理メモリを独自の目的で使用します(内部構造、テーブル、バッファ、キャッシュなど)。メモリのオーバーコミットメント設定は、ユーザーランドアプリケーションの仮想メモリ予約を処理します。カーネルは仮想メモリを使用せず、物理メモリを使用します。

そもそもなぜこのパラメータが必要なのですか?

overcommit_ratioパラメータは、将来的に、つまり実際にメモリにアクセスする(または少なくとも試行する)ときに、アプリケーションが仮想メモリを合理的に利用できる量よりも多く予約しないように設計された実装選択です。

設定overcommit_ratio 50%までは、Linuxカーネル開発者によって妥当なデフォルト値と見なされています。これは、カーネルが物理RAMの50%以上を使用する必要がないことを前提としています。あなたのマイレージは変わるかもしれません、それが調整可能な理由です。

常に100%に設定すべきではないのはなぜですか?

100%(または「高すぎる」値)に設定しても、カーネルが0%(または少なすぎる)のRAMを使用すると想定できないため、オーバーコミットを確実に無効にすることはできません。

カーネルが要求するすべての物理メモリをとにかく先取りする可能性があるため、アプリケーションのクラッシュを防ぐことはできません。

6
jlliagre

この比率を100%に設定しても、ファイルを使用するページや、カーネルコード、ネットワークバッファーなどのカーネル内の割り当て用の領域は予約されません。

カーネル内の構造は関係なく割り当てられ、オーバーコミットを引き起こします。通常、これらは個別に制限されます(たとえば、ネットワークバッファーの設定があります)。全体的な制限は50%であるとは思いませんが、全体的な制限は、コンテナーをホストする目的で取り組んだものです。

ファイルを使用するページは、通常、ユーザースペースコードを実行する場所なので、そのためのスペースも必要です。

2
sourcejedi