仮想環境のホストとゲストはそれぞれどのようにメモリを配分しているのですか?

freja-nelson-vDJ0LQJkp6s-unsplash.jpg

質問

仮想環境のホストとゲストはそれぞれどのようにメモリを配分しているのですか?


解答

良いテーマですね。
仮想環境の ホスト と ゲスト がどのようにメモリを配分しているかを整理すると、だいたい次のような仕組みになっています。


1. ホスト側のメモリ管理

* ホストOS(またはハイパーバイザ) は、物理メモリを「どのゲストにどれだけ渡すか」を管理します。
* VM を作成するときに「このゲストに 4GB 割り当てる」と指定すると、ホストの物理メモリから 4GB 分を確保します。
* この時点で、ホストにとっては「ゲストのメモリ領域」も一種のアプリケーション用メモリとして扱われます。


2. ゲスト側のメモリ管理

* ゲストOSは「自分専用の物理メモリがある」と思い込んで使います。
例えば「4GB 割り当て」られた場合、ゲストOSは本当に 4GB の RAM があるかのようにページ管理やキャッシュを行います。
* 実際にはそれはホストから借りた領域であり、ゲストが管理しているメモリページはすべてホストのプロセスの中に収まっています。


3. ハイパーバイザの工夫(高度なメモリ配分)

ホストは単純に固定割り当てするだけでなく、効率化のためにいくつかの技術を使います:
* Ballooning(バルーニング) ホストがメモリ不足のとき、不要なゲストからメモリを回収して、他のゲストに再割り当てする。
(ゲストOS内に「バルーンドライバ」を挿入して、メモリを強制的に消費させ→解放させる仕組み)
* Memory Overcommit(メモリの過剰割り当て) 実際の物理メモリ

以上の容量を複数ゲストに割り当てる。
例えばホストに16GBしかなくても、各ゲストに合計32GBを「論理的に」与える。
→ 実際には未使用ページやスワップでやり繰りする。
* Page Sharing(ページ共有/KSM) 複数のゲストが同じ内容のメモリ(例: OSのカーネル部分)を持っている場合、ホストはそれを1つの物理メモリにまとめて共有する。


4. まとめると

* ホスト → 物理メモリを全体的に管理し、ゲストに「仮想RAM」として割り当てる。
* ゲスト → 割り当てられたメモリを、自分の物理メモリだと思ってページ管理を行う。
* ハイパーバイザの工夫 → バルーニング・オーバーコミット・ページ共有などで効率よく使う

実際の運用では「ホストのメモリ不足で全ゲストが遅くなる」のが典型的なトラブルですが、これを避けるために 固定割り当て(予約) と バルーニング をどう組み合わせるかが重要です。







 



この記事へのコメント