仮想化: Hyper-V のメモリ使用状況を最適化する
動的メモリは便利な機能ですが、仮想マシンとホスト サーバーを構成するときには注意が必要です。
Brien M. Posey
仮想ワークロードをホストするうえで、全体的なパフォーマンスにおいて最も重要なハードウェア リソースは、物理メモリです。仮想マシンには、各仮想マシンで必要な量のメモリを割り当てることが重要ですが、プロセスでメモリを空費しないようにする必要もあります。この記事では、Microsoft Hyper-V における仮想マシンのメモリ割り当てに関する重要な考慮事項を紹介します。
NUMA に関する考慮事項
Hyper-V のメモリ管理では、ちょっとしたテクニックが必要になります。各 VM に十分な量のメモリを準備し、また、それと同時に、必要以上のメモリを割り当てないようにする必要もあります。
その理由は非常にわかりやすいものですが、特定の VM に過剰にメモリを割り当てると、同じサーバーでホストしている他の VM に割り当てられるメモリ量が制限されます。また、VM に過剰にメモリを割り当てると、パフォーマンスが低下することがあります。
多くの新しいサーバーでは、Non-Uniform Memory Access (NUMA) メモリを使用しています。NUMA メモリは、プロセッサ単位でメモリを割り当てることによってパフォーマンスを向上するように設計されています。各メモリのブロックは、NUMA ノードと呼ばれます。CPU では、ローカルの NUMA ノード (CPU に直接割り当てられているメモリ) の方が、リモートの NUMA ノードよりも迅速にアクセスできます。
Windows Server 2008 と Windows Server 2008 R2 の Hyper-V では、NUMA ノード単位のメモリ アフィニティを直接サポートしていません。つまり、特定の NUMA ノードを使用するように VM を直接構成することはできません。この機能は、Windows Server 8 の Hyper-V でも継承されます。とは言っても、VM がリモートの NUMA ノードを使用する確率を下げることは可能です。
鍵となるのは、各 NUMA ノードのサイズを算出することです。たとえば、サーバーに 2 基のオクタ コアのプロセッサと 128 GB の RAM が搭載されているとします。NUMA ノードのサイズは、メモリ サイズ (128 GB) を CPU コアの数 (16) で除算することで算出できます。この例では、NUMA ノードのサイズは 8 GB になります。
Hyper-V では、特定の NUMA ノードを特定の VM に割り当てることができません。ただし、このサーバーの NUMA ノードのサイズが 8 GB であることを把握しているので、8 GB 以上のメモリを割り当てた VM では、複数の NUMA ノードのメモリを使用することが保証されていると推測できます。この場合、VM に割り当てるメモリのサイズを 8 GB 以下に制限すると、VM が単一の NUMA ノードのメモリを使用する可能性が高くなり、パフォーマンスが向上します。
Hyper-V のオーバーヘッド
メモリ管理で注意が必要なのは、NUMA ノードだけではありません。ホスト サーバーのメモリの使用方法を計画するときには、仮想化に関連するオーバーヘッドを考慮することが非常に重要です。仮想化のオーバーヘッドに関する重要な考慮事項は、2 つあります。1 つは、親パーティション用のメモリを予約する必要があることです。
少なくとも 300 MB をハイパーバイザー用に、512 GB を親パーティションで実行しているホスト OS 用に予約する必要があります。ただし、多くのベスト プラクティス ガイドラインには、親パーティション用に 2 GB のメモリを予約する必要があると記載されています。
(管理エージェント、バックアップ エージェント、ファイアウォールなど、セキュリティやインフラストラクチャ関連のソフトウェアを実行することは可能ですが) 親パーティションは、Hyper-V 以外のものに使用することはお勧めしません。そのため、この 2 GB という推奨値は、親パーティションで他のアプリケーションやサーバーの役割を実行しないことを前提としています。
Hyper-V では、親パーティションに直接メモリを割り当てることはできません。親パーティションでは、基本的に、余剰メモリを使用します。そのため、ホスト サーバーのメモリのうち 2 GB のメモリは割り当てられていない状態を維持して、親パーティションで使用できるようにすることを覚えておく必要があります。
ゲスト マシンへのメモリ割り当て
仮想化に関連するオーバーヘッドに関する、もう 1 つの考慮事項は、VM で統合サービスや他の仮想化に関連するプロセスで少量のメモリを使用することです。このメモリ量は少量なので、基本的に、このために追加のメモリを割り当てることについて心配する必要はありません。ただし、各 VM に最低限のメモリしか割り当てない場合は、この追加のメモリについても考慮する必要があります。
1 GB 以下の RAM が割り当てられている VM の仮想化に関連するオーバーヘッドで使用するメモリは、32 MB です。VM に割り当てる RAM が 1 GB 増えるごとに、8 MB のメモリを追加することをお勧めします。たとえば、2 GB の RAM を割り当てた VM では、仮想化に関連するオーバーヘッドで 40 MB (32 MB + 8 MB) のメモリを使用します。同様に、5 GB のメモリを割り当てた VM では、オーバーヘッドで 64 MB のメモリを使用することになります。
動的メモリ
Windows Server 2008 R2 SP1 では、現在のワークロードに基づいて、VM で動的にメモリを消費できる動的メモリという新機能が導入されました。この機能では、サーバーの物理メモリを多く割り当てて、動的メモリを使用しなかった場合よりも多くの VM を実行できるようにすることが可能です。動的メモリを使用することで得られるメリットはありますが、VM によってメモリが枯渇しないように、いくつかのベスト プラクティスのガイドラインに従うことが重要です。
動的メモリを使用することが、必ずしも最善の選択肢であるとは限りません。VM ごとに動的メモリを有効/無効にできます。動的メモリのメリットを享受できる VM のみで動的メモリを有効にすることが重要です。
最も重要な考慮事項の 1 つは、VM のワークロードです。VM で実行しているアプリケーションが一定量のメモリを使用するように設計されている場合、その VM では、動的メモリを使用するよりも、VM で必要な量のメモリを割り当てることをお勧めします。
集中的にメモリを使用するアプリケーションについても同じことが言えます。一部のアプリケーションは、利用可能なメモリをすべて使用するように設計されています。このようなアプリケーションで動的メモリを有効にすると、サーバーの物理メモリがあっという間に枯渇します。このような種類のアプリケーションを実行する VM には一定量のメモリを割り当てることをお勧めします。
最後に、VM で複数の NUMA ノードのメモリを使用しようとすると、サーバーのパフォーマンスが低下することがあります。そのため、サーバーで NUMA メモリを使用しており、パフォーマンスが重要な場合、動的メモリは使用しないことをお勧めします。
スタートアップ RAM
スタートアップ RAM は、理解することが重要な動的メモリの概念の 1 つです。動的メモリを使用するときには、各 VM にスタートアップ RAM の値を設定する必要があります。この値は、VM が起動時に使用する物理メモリの量を表します。さらに重要なのは、スタートアップ RAM が、VM で使用する物理メモリの最低量を表すことです。VM のメモリ使用量は、スタートアップ RAM に設定されている量より少なくすることはできません。
そのため、マイクロソフトでは、VM のスタートアップ RAM に大きな値を設定しないことを推奨しています。スタートアップ RAM の値は、VM で実行している OS に基づいて決めるのが最善です。マイクロソフトでは、Windows 7、Windows Vista、Windows Server 2008、および Windows Server 2008 R2 を実行している VM のスタートアップ RAM の推奨値を 512 MB としています。また、Windows Server 2003 または Windows Server 2003 R2 を実行する場合のスタートアップ RAM の推奨値を 128 MB としています。
VM で動的メモリを使用するには、VM で実行している OS で動的メモリがサポートされている必要があります。Windows XP では、動的メモリはサポートされていません。動的メモリを使用するように構成された VM で Windows XP を実行すると、OS では、スタートアップ RAM で設定されたサイズのメモリにしかアクセスできません。
他の構成作業に進む前に、すべての VM のスタートアップ RAM に設定されている値の合計が、サーバーに搭載されている物理 RAM を超えていないことを確認することが重要です。物理 RAM のサイズを超える場合は、一部の VM を削除するか、メモリを追加する必要があります。
また、最大 RAM の値を調整することもお勧めします。この値は、VM で使用できる物理メモリの最大量を表します。Hyper-V の既定の設定では、各 VM の最大 RAM は 64 GB に設定されています。64 GB もの物理メモリを使用しない VM がある場合は、RAM の最大値を下げることができます。
メモリの優先度
動的メモリの背景にあるのは、メモリを多く使用できるようにすることです。この機能により、VM では、必要なときにメモリにアクセスできるようになります。ハードウェア リソースを多く使用することの大きな欠点は、リソースが枯渇する可能性があることです。動的メモリの場合、利用可能なすべての物理メモリを消費しても、VM で必要なメモリ量に対応できない状況は十分あり得ます。
この問題に対する長期的な対策は、VM の要件に対応するのに十分なメモリをサーバーに搭載することですが、短期的な対策は、メモリの使用に優先順位を付けることです。
どのホスト サーバーにも、他の VM より重要な VM があります。Hyper-V では、このような VM の優先度を高くし、物理メモリが不足したときには、まず優先度の高い VM にメモリが割り当てられるようにすることが可能です。メモリの優先度を調整することで、動的メモリを使用する場合の VM の優先順位を設定できます。メモリの優先度が高い VM は、メモリの優先度が低い VM よりも優先されます。
動的メモリを使用する各 VM で構成する必要がある他の設定には、メモリ バッファーがあります。メモリ バッファーの設定では、各 VM がバッファーとして予約するメモリ量を制御します。この値は割合で設定します。たとえば、VM が 4 GB の割り当てられたメモリを使用しており、メモリ バッファーが 50% に設定されている場合、その VM では、最大 6 GB のメモリを消費できます。
メモリ バッファーは、指定した割合のメモリが VM でメモリ バッファーとして利用できることを保証するものではなく、単に VM で要求できるメモリ量を制御するための設定です。メモリ バッファーは、割合で指定するため、VM が特定の時点で使用しているメモリ量によってメモリ バッファーの量は変動します。動的メモリを使用している VM も、起動時には、最低限の量のメモリを使用します。VM では、メモリのワークロードに基づいてメモリの使用量を調整します。
メモリの構成
実際に VM のメモリ使用量を構成する手順は、シンプルです。Hyper-V マネージャーを起動し、特定の VM を右クリックします (各 VM のメモリは個別に管理されています)。[設定] をクリックし、設定ダイアログ ボックスが表示されたら、[メモリ] をクリックします。
Hyper-V では、VM に一定量のメモリを割り当てるか、動的メモリを使用するかを選択できます (図 1 参照)。[動的] を選択すると、スタートアップ RAM、最大 RAM、メモリ バッファー、およびメモリの優先度を設定ダイアログ ボックスで調整できます。
図 1 設定ダイアログ ボックスで仮想マシンのメモリ割り当てを調整できる
ホスト サーバーの物理メモリ リソースが限られている場合、静的メモリと動的メモリの間にはトレードオフがあります。一般に、静的メモリを選択すると、全体的なパフォーマンスが向上します (ただし、十分なメモリが割り当てられていることが前提となります)。一方、動的メモリは、一般的に注意が必要ですが、より多くの VM を使用できるようになります。
Brien Posey は、MVP であり、数千件の記事と数十冊の書籍を執筆した実績のあるフリーランスのテクニカル ライターです。Posey の Web サイトのアドレスは brienposey.com (英語) です。