オーバーコミット時に仮想マシンにスワップ領域 (スワップファイル) をメモリとして使用させることはできますか?

オーバーコミット時に仮想マシンにスワップ領域 (スワップファイル) をメモリとして使用させることはできますか?

私は VM と KVM でいくつかの実験を行っています。オーバーコミットとスワップ領域の事実を理解しようとしています。まず、この実験のために作成したシステム セットアップと関連する構成を示します。

私のホスト コンピュータ システムには次のものがあります:

  1. メモリ(DRAM): 16GB
  2. スワップスペース(スワップパーティション): 32GB
  3. SSD: 512GB

私の VM には次のものがあります:

  1. メモリ: 4GB
  2. スワップスペース(スワップパーティション): 8GB
  3. 仮想ディスク容量: 20GB

cgroupインターフェースでVMのメモリリソースを4GBから1GBに制限すると、過剰なコミットメントこの問題の解決を試みたのですがWAPスペースチェック済みvmstat動作したかどうか。スワップ領域をメモリとして使用していないようです。

オーバーコミットの状況時に VM がスワップ領域を使用しなかったのはなぜですか?

答え1

あなたが見逃しているのは、「オーバーコミットメント」が何を意味するかということだと思います。

オーバーコミットメントは、システムに制約したリソースよりも多くのリソースを実際に持つために使用するトリックではありません。より多くのリソースがあるかのように動作するためのテクニックです。

基本的な概念は、ほとんどのプログラムは実際に使用するよりも多くのメモリを割り当てるということです。たとえば、57 バイトしかないファイルを読み込むために 32K の RAM を割り当てることがあります。読み込み、実際には 1 ページのメモリを使用します。しかし、それでも 32K は割り当てられています。この例は 90 年代のものであり、今日では割り当てが大きく、ファイルも大きくなっていますが、ポイントは、余分なメモリは依然として回収されないコミットメントであるということです。

私の記憶が間違っていなければ、これは、故意にそれを行うわけではない一部のプログラムでも発生します。なぜなら、そのようなプログラムはそれを行うライブラリをロードし、それらのライブラリをロードすることでもそれが実行されるからです。リンカーはライブラリに十分なメモリを割り当てますが、実際に呼び出されるルーチンだけが実際にロードされます。それはおそらく共有メモリなので、その影響は最小限に抑えられますが、それでも存在します。

発生する過剰なコミットメントの量は、呼び出されるプログラムとその使用方法に大きく依存します。プログラムが非常に徹底的に実行される場合、そのライブラリの一部がより多く使用される可能性があります。malloc ではなく calloc を呼び出すプログラムは、それほど過剰なコミットメントとして現れません。これは、calloc が割り当てられた領域のすべてのバイトに書き込みを行うため、実際に使用されるメモリの部分がはるかに少ない場合でも、要求されたコミットメントを OS が満たす必要があるためです。一部のプログラムは、必要なメモリ量のみを割り当てるように非常に注意していますが、他のプログラムは、データ構造の配置を実用的にするために、OS がオーバーコミットメントをサポートしていることに依存しています。

1GB の使用に制限したサーバー上のアプリケーションが、実際に 1GB 相当のページにアクセスしようとすると、使用できるように構成された 8GB のスワップが使用されます。ただし、これはオーバーコミットには使用されません。技術的には、実際に所有する 9GB の VM を超えて割り当てるまで、オーバーコミットは使用されません。

そうは言っても、これは Linux であり、オーバーコミットを有効にせずに Linux を最大メモリ割り当てにプッシュしようとすると、少し早く失敗する傾向があることを思い出します。少量のファイル キャッシュなど、さまざまなもののためにいくらかの予備が保持されます。その経験は 10 年以上前のことですが、特にそれを変更する理由は見当たりません。ファイル I/O を実行できるメモリがあることは重要です。

関連情報