メモリ リソースを管理する前に、メモリ リソースが ESXiによってどのように仮想化され、使用されるかを理解しておく必要があります。

VMkernel は、ホスト上のすべての物理 RAM を管理します。VMkernel は、この管理対象物理 RAM の一部を自身専用にします。残りが、仮想マシン用に使用可能になります。

仮想および物理メモリ スペースは、ページと呼ばれるブロックに区分されます。物理メモリが一杯になった場合、物理メモリ内に存在しない仮想ページのデータは、ディスクに格納されます。プロセッサ アーキテクチャに応じて、ページは通常 4 KB または 2 MB です。メモリの詳細属性を参照してください。

仮想マシンのメモリ

各仮想マシンは、構成されたサイズに基づいてメモリを消費し、加えて仮想化のためのオーバーヘッド メモリを消費します。

構成されたサイズは、ゲスト OS に提供されるメモリ容量です。これは、仮想マシンに割り当てられる物理 RAM 容量とは異なります。後者は、リソース設定(共有、予約、制限)やホストのメモリ プレッシャーのレベルに依存します。

たとえば、構成済みサイズが 1GB の仮想マシンについて考えます。ゲスト OS は起動するときに、物理メモリが 1GB の専用マシンで実行していると考えています。場合によっては、仮想マシンに 1GB が完全に割り当てられます。別の場合には、より小さな割り当てを受けることがあります。実際の割り当てにかかわらず、ゲスト OS は、物理メモリが 1GB の専用マシンで実行している場合と同じ動作を続けます。

シェア
予約以外に指定可能な場合、ここで仮想マシンの相対的な優先順位を指定します。
予約
メモリがオーバーコミットされる場合でも、ホストが仮想マシン用に予約する物理 RAM 容量の、保証された下限です。過大なページングがなく効率的に動作するのに十分なメモリを仮想マシンが確実に利用できるよう、予約のレベルを設定します。

仮想マシンは、その予約内のすべてのメモリを消費した後、たとえアイドル状態になった場合でもその量のメモリを保持することができ、そのメモリは解放されません。一部のゲスト OS(Linux など)は、起動直後に構成済みメモリの全部にはアクセスできない場合があります。仮想マシンがその予約内のすべてのメモリを消費するまで、VMkernel はその予約の任意の未使用部分を他の仮想マシンに割り当てることができます。しかし、ゲストのワークロードが増加し、仮想マシンがその予約分全体を消費した場合、仮想マシンはそのメモリを保持できます。

制限
ホストが仮想マシンに割り当てることができる物理 RAM 容量の上限です。仮想マシンのメモリ割り当ては、構成済みサイズでも暗黙的に制限されます。

メモリのオーバーコミット

システムは実行中の仮想マシンごとに、仮想マシンの予約(ある場合)用と、仮想マシンの仮想化オーバーヘッド用に物理 RAM を予約します。

すべての仮想マシンの構成済み総メモリ サイズが、ホストで使用可能な物理メモリ容量を超える可能性があります。ただし、必ずしもメモリがオーバーコミットされることを意味するわけではありません。すべての仮想マシンの動作中のメモリ フットプリントの合計がホストのメモリ サイズを超える場合に、メモリはオーバーコミットされます。

ESXi ホストのメモリ管理手法のおかげで、仮想マシンは、ホストで利用可能な物理 RAM より多い仮想 RAM を使用できます。たとえば、2GB のメモリを持つホストがある場合に、それぞれ 1GB のメモリを持つ 4 台の仮想マシンを実行できます。この場合、メモリがオーバーコミットされます。たとえば、4 つの仮想マシンすべてがアイドル状態の場合、消費メモリの合計は 2 GB を大幅に下回っている可能性があります。ただし、4 GB の仮想マシンすべてがアクティブにメモリを消費している場合は、メモリ フットプリントが 2 GB を超えて、ESXi ホストがオーバーコミットされる可能性があります。

オーバーコミットが有用なのは、一般に、仮想マシンには負荷の軽いものと負荷の重いものがあり、相対的な動作レベルが時間とともに変動するためです。

メモリの使用率を向上させるために、ESXi ホストは、アイドル状態の仮想マシンから、より多くのメモリを必要とする仮想マシンにメモリを移動します。予約またはシェアのパラメータを使用して、重要な仮想マシンにメモリを優先的に割り当てます。このメモリは、使用されていない場合にほかの仮想マシンで利用できます。ESXi は、ホストのメモリが大きくオーバーコミットされていない場合でも、バルーン、メモリ共有、メモリ圧縮、スワップなど、さまざまなメカニズムを実装して適切なパフォーマンスを実現します。

仮想マシンのメモリがオーバーコミットされた環境で予約可能なメモリをすべて消費すると、 ESXi ホストはメモリ不足になる可能性があります。パワーオンされている仮想マシンは影響を受けませんが、新しい仮想マシンはメモリが不足しているためにパワーオンに失敗する場合があります。
注: すべての仮想マシンのメモリ オーバーヘッドも予約済みとして認識されます。

また、メモリ圧縮 で説明するように、メモリのオーバーコミット時に仮想マシンのパフォーマンスを向上させるため、ESXi ホストではメモリ圧縮がデフォルトで有効になっています。

メモリの共有

メモリ共有は、ホスト上でメモリ密度を高めるための独自の ESXi 技法です。

メモリ共有は、いくつかの仮想マシンが同じゲスト OS のインスタンスを実行している状態を利用する技術です。これらの仮想マシンは、同じアプリケーションまたはコンポーネントをロードする場合や、共通のデータを含む場合があります。このような場合、ホストは、独自の透過的なページ共有 (TPS) 技法を使用してメモリ ページの冗長コピーを除去します。メモリの共有により、仮想マシンで実行しているワークロードが使用するメモリが、物理マシン上で実行する場合の使用量よりも少なくなることがよくあります。結果的に、より高いレベルのオーバーコミットを効率的にサポートできます。メモリ共有によって節約されるメモリ容量は、ワークロードがほぼ同じマシンに集中しているために、より多くのメモリが解放されるかどうかによって異なります。ワークロードが分散するほど、メモリ節約の度合いが低くなる可能性があります。

注:

セキュリティ上の懸念があるため、仮想マシン間の透過的なページ共有はデフォルトで無効になっており、ページ共有は仮想マシン内のメモリ共有に制限されます。ページ共有は、複数の仮想マシン間で行われることはなく、特定の仮想マシン内でのみ行われます。詳細については仮想マシン間でのメモリの共有を参照してください。

メモリ仮想化

仮想化によって導入される特別なレベルのメモリ マッピングのため、ESXiは、すべての仮想マシン間でメモリを効率的に管理できます。

仮想マシンの一部の物理メモリが共有ページにマッピングされるか、マッピングされていないページまたはスワップアウトされているページにマッピングされます。

ホストは仮想メモリ管理を行いますが、ゲスト OS が認識したり、ゲスト OS のメモリ管理サブシステムの干渉を受けたりすることはありません。

各仮想マシンの VMM は、ゲスト OS の物理メモリ ページから、基盤となるマシン上の物理メモリ ページへのマッピングを保持します(VMware は、基盤となるホスト物理ページを 「マシン」 ページとして参照し、ゲスト OS の物理ページを 「物理」 ページとして参照します)。

各仮想マシンは、ゼロ ベースの連続したアドレス可能物理メモリ スペースを参照します。各仮想マシンによって使用される、サーバの基盤となるマシン メモリは、必ずしも連続しません。

ゲストの仮想アドレスとゲストの物理アドレスとのマッピングは、ゲスト OS によって管理されます。ハイパーバイザーの役割は、ゲストの物理アドレスをマシン アドレスに変換することだけです。ハードウェア アシストによるメモリ仮想化では、ハードウェア機器を活用し、ゲストのページ テーブルとハイパーバイザーによって管理されるネストしたページ テーブルを使用して統合されたマッピングを生成します。

図は、ESXiでのメモリ仮想化の実装を示しています。

図 1. ESXiのメモリ マッピング

この図は、メモリ仮想化の実装を示しています。
  • ボックスはページを表し、矢印はそれぞれメモリ マッピングを表します。
  • ゲスト仮想メモリからゲスト物理メモリへの矢印は、ゲスト OS 内のページ テーブルが保持するマッピングを表します(仮想メモリから x86 アーキテクチャ プロセッサのリニア メモリへのマッピングは示していません)。
  • ゲスト物理メモリからマシン メモリへの矢印は、VMM が保持するマッピングを表します。
  • 点線の矢印は、ゲストの仮想メモリから、シャドウ ページ テーブル (これも VMM が保持) のマシン メモリへのマッピングを表します。仮想マシンを実行している基盤となるプロセッサは、シャドウ ページ テーブルのマッピングを使用します。

ハードウェア アシストによるメモリ仮想化

AMD SVM-V や Intel Xeon 5500 シリーズなどの一部の CPU は、ページ テーブルの 2 つのレイヤーを使用することで、ハードウェアからメモリ仮想化をサポートする機能を提供しています。

注: このトピックでは、「メモリ」は物理 RAM または永続的なメモリを参照できます。 []

ページ テーブルの 1 番目のレイヤーには、ゲストの仮想メモリから物理メモリへの変換が格納されています。 ページ テーブルの 2 番目のレイヤーには、ゲストの物理メモリからマシンへの変換が格納されています。TLB (変換索引バッファ) は、プロセッサの MMU (メモリ管理ユニット) ハードウェアが維持する変換のキャッシュです。TLB ミスはこのキャッシュのミスであり、ハードウェアはメモリに (おそらく複数回) アクセスして必要な変換を検索する必要があります。TLB でゲストの仮想アドレスが参照できない場合、ハードウェアが両方のページ テーブルを検索し、ゲストの仮想アドレスをマシン アドレスに変換します。ページ テーブルの 1 番目のレイヤーは、ゲスト OS によって維持されます。VMM は、ページ テーブルの 2 番目のレイヤーのみを維持します。

パフォーマンスについての考慮事項

ハードウェア アシストを使用すると、ソフトウェア メモリ仮想化のオーバーヘッドをなくすことができます。特に、ハードウェア アシストによって、シャドウ ページ テーブルをゲスト ページ テーブルと同期させておくために必要なオーバーヘッドがなくなります。ただし、ハードウェア アシストを使用すると、TLB ミスの遅延が大幅に増えます。デフォルトでは、ハイパーバイザーは、ハードウェア アシスト モードで大きなページを使用して、TLB ミスのコストを削減します。結果として、ハードウェア アシストを使用することによってワークロードにメリットがあるかどうかは、ソフトウェアによるメモリ仮想化を使用した場合に発生するメモリ仮想化のオーバーヘッドに大きく依存します。ワークロードに含まれるページ テーブル アクティビティ (プロセス作成、メモリのマッピング、コンテキスト スイッチなど) が少ない場合、ソフトウェアの仮想化では、大きなオーバーヘッドは発生しません。逆に、ワークロードに大量のページ テーブル アクティビティが含まれている場合は、ハードウェア アシストを使用すると有益です。

デフォルトでは、ハイパーバイザーは、ハードウェア アシスト モードで大きなページを使用して、TLB ミスのコストを削減します。最適なパフォーマンスは、ゲストの仮想アドレスからゲストの物理アドレスへの変換とゲストの物理アドレスからマシン アドレスへの変換の両方で大きなページを使用することで実現されます。

オプション LPage.LPageAlwaysTryForNPT によって、ゲストの物理アドレスからマシン アドレスへの変換で大きなページを使用するようにポリシーを変更できます。詳細については、メモリの詳細属性を参照してください。

ラージ ページ サイズのサポート

ESXi は、ラージ ページ サイズに対して限定的なサポートを提供しています。

x86 アーキテクチャにより、システム ソフトウェアで 4 KB、2 MB、および 1 GB のページを使用できます。4 KB のページはスモール ページと呼び、2 MB と 1 GB のページはラージ ページと呼びます。ラージ ページは、トランスレーション ルックアサイド バッファ (TLB) の負荷を軽減し、ページ テーブル ウォークのコストを削減します。これにより、ワークロードのパフォーマンスが向上します。

仮想化環境では、ラージ ページは、ハイパーバイザーとゲスト OS によって個別に使用できます。ラージ ページがゲストとハイパーバイザーによって使用された場合、パフォーマンスに著しい影響が及びますが、通常、ラージ ページがハイパーバイザー レベルでのみ使用された場合でも、パフォーマンスには影響が及びます。

ESXi ハイパーバイザーは、デフォルトでゲスト vRAM のバッキングに 2 MB のページを使用します。vSphere ESXi は、1 GB ページでのゲスト vRAM のバッキングに対して限定的なサポートを提供しています。詳細については、「1 GB ページでのゲスト vRAM のバッキング」を参照してください。