OSのメモリバルーニング


13

一部のハイパーバイザーは、バルーニングと呼ばれる方法を使用してメモリ使用量を最適化します(少なくともKVMが呼ぶ方法です)。この方法は、VM間のメモリを重複排除し、共通ページをコピーオンライトで読み取り専用に設定します。
これは、fork呼び出しの反対です。

プロセスに対してOSレベルで実装することは可能ですか(同じサイトで複数のタブを持つChromiumでブラウジングするとき、主にメモリの重複を考えていました)、すでに実装されていますか?

回答:


14

実際、あなたが説明したことは、バルーニングと「同じページのマージ」を混同します。区別を明確にするために、2つについて詳しく説明します。

メモリーバルーニング

これは、ゲスト仮想マシンに割り当てられたメモリの一部を別のゲストまたはホスト自体(キャッシュなど)が引き続き使用できるようにするためのトリックです。以下の方法で行われます。

ゲストカーネルにはドライバーが注入され、ゲストメモリの使用状況を監視し、未使用のメモリの一部を「盗み」ます(ゲストメモリ空間でそれを割り当て、このゲストがその範囲にアクセスできないようにします)。

次に、ホストカーネルに、実際にこれらのメモリページをコアから削除できること、ゲストで使用されないことを通知します(ゲストがメモリのプレッシャーを経験するまで、その時点でバルーンが収縮し、使用されます)再びこれらの範囲)。

最終的に、カーネルはまったく同じメモリを別のゲストに割り当てることができ、ゲストが大量の空きメモリで実行されている場合、メモリ全体の使用効率が大幅に向上します。

同じページのマージ

この手法は、何らかの理由でコピーオンライトで「準読み取り専用」としてまだマークされていない同一のメモリページを識別し、そのようにマークします。

現在、OSレベルでは、これらの種類のトリックの必要性は限られています。単純に、ほとんどの場合、同一のメモリページがある場合、それらはほとんどがアプリケーションコード、ライブラリなどであるため、すでに読み取り専用です(場合によってはCoWなしでも)。これらはメモリマップを通じてネイティブに開かれ、したがってカーネルは保持できますそれらのコピーはコアに1つだけです(存在する場合は、完全にページアウトし、必要に応じてプライマリストアからページインできるようにします)。

仮想化OSレベルでは、同じ原則が各ゲストサブシステム内に適切に適用されます。ただし、ホストカーネルは、2人のゲストがほとんど同じコードを実行しているかどうかわからないため、同じメモリを共有しています。ゲストはそれを調整するために通信しません。

システム全体で同一のメモリページをスキャンできる場合があります-ほとんどの場合、各ページ内ではなく、ゲストOS 全体で同一です-ゲストカーネルは、メモリをその範囲内に整然と保持するまともなジョブを作成します。したがって、1つのホストカーネルが50以上のゲストを処理する一般的なVM環境では、メモリの節約はかなり大きくなります。

両方同時に

バルーニングと同一ページのマージは非常にうまく共存でき、同一のシステムでかなりのメモリオーバーコミットを達成できます。


質問に答えるために、Same-Page-MergingはOSレベルで有効にできる場合があります。解釈されるページ共有に関係するため、同じバッキングファイルがなくても同一になる可能性があります。

Chromiumの例-プロセスバイナリ自体は、読み取り専用のスタートアップマップを介して既に重複排除されています-それらはまったく同じメモリスペースを共有しています。ページキャッシュ(タブのコンテンツ)は通常、ディスクキャッシュの管理方法によりプロセス間で共有されます(読み取り専用コピーオンライト)-VMの異なるプロセス間で同じオンディスクファイルをシミュレートして開くことができます-最適な感覚。

利点は、異なるJavascriptエンジンの共有状態で最も明白になりますが、それらがまったく同じメモリレイアウトで割り当てられ、メモリページ全体が同一であることを保証するかどうかはわかりません。

これは、モバイルシステムでは異なります。たとえば、AndroidはKSMを広く採用して、異なるアプリケーション間で同一のコードを重複排除します。

どちらの場合でも、Linux(Kernel SamePage Merging)で自分で有効にすることができます。ドライバーはさまざまな統計をエクスポートします。この回答を読んだ後、目的に合っているかどうかを解釈し、独自の決定を下すことができるはずです。

https://www.kernel.org/doc/Documentation/vm/ksm.txt


3
同じページのマージは、ハイパーバイザー(およびその古さ)に応じて、「超越メモリ」とも呼ばれます。
ティムポスト

ありがとう、KSMはアプリケーションがそれを認識していることを要求しているようで、(迅速な)検索から、現在のところChromiumはそれをサポートしていません。私は、バイナリが重複排除されていることを承知していますが、私はほとんど...私のRAM上に重い負担をかけるJIT出力と生のスクリプトを参照しています

Chromiumの未加工スクリプトも重複排除されます。他のすべてのWebオブジェクトと同様にディスクキャッシュに格納され、ディスクキャッシュは読み取られずにマッピングされます。
qdot 14

生のスクリプトはマッピングされますが、一般的なスクリプト(jQueryやAngular.jsなど)でさえキャッシュに複製され、さまざまなサイトサーバーでCDNとスクリプトファイルの正確なレプリカが頻繁に使用されるため、互いに一致しません。

これはおそらくチャットで終わるはずですが、LinuxのKSMからの統計を見てみたいです。
qdot 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.