Hyper-V の NUMA

Non-Uniform Memory Access (NUMA) はマルチプロセッサ システムのメモリ アーキテクチャであり、プロセッサは、そのプロセッサに対してメモリを物理的に閉じる方法に応じて、メモリの一部の領域に他の領域よりも高速にアクセスできます。 データベースやハイ パフォーマンス コンピューティング アプリケーションなど、メモリ アクセスの待機時間に敏感なワークロードは、実行しているプロセッサに対してローカルなメモリを使用すると、パフォーマンスが向上します。

Hyper-V では、仮想 NUMA トポロジを仮想マシン (VM) に投影することで NUMA がサポートされます。 仮想 NUMA を使用すると、VM とその NUMA 対応アプリケーションはホストのメモリ アーキテクチャを利用できるため、使用する CPU コアに物理的に近いメモリにアクセスできます。

この記事では、仮想 NUMA トポロジ、NUMA スパン、NUMA が動的メモリと対話する方法など、Hyper-Vの NUMA の概念について説明します。 NUMA 設定はマルチプロセッサ システムにのみ適用されます。単一プロセッサ システムには複数の NUMA ノードがありません。

NUMA とは

Non-Uniform Memory Access (NUMA) は、メモリの一部の領域のアクセス待機時間が長いマルチプロセッサ 設計用のコンピューター システム アーキテクチャです。 この待機時間の違いは、システムがメモリとプロセッサを相互接続する方法に起因します。 一部のメモリ領域は 1 つ以上のプロセッサに直接接続され、すべてのプロセッサはさまざまな種類の相互接続ファブリックを介して相互に接続されます。 大規模なマルチプロセッサ システムの場合、この配置により、メモリの競合が少なくなり、システム パフォーマンスが向上します。

NUMA アーキテクチャは、メモリとプロセッサを NUMA ノードと呼ばれるグループに分割します。 システム内の任意の 1 つのプロセッサの観点から見ると、そのプロセッサと同じ NUMA ノード内のメモリはローカルであり、別の NUMA ノードのメモリはリモートです。 プロセッサは、リモート メモリよりも高速にローカル メモリにアクセスできます。

最新のオペレーティング システムと、通常は多数のプロセッサと大量のメモリ (Microsoft SQL Server など) を使用するようにスケーリングする多くのハイ パフォーマンス アプリケーションには、コンピューターの NUMA トポロジを認識して適応させる最適化が含まれます。 リモート アクセスのペナルティを回避するために、NUMA 対応アプリケーションは、データにストレージを割り当て、プロセッサ スレッドが同じ NUMA ノード内のデータにアクセスするようにスケジュールしようとします。 これらの最適化により、メモリ アクセスの待機時間を最小限に抑え、メモリ相互接続トラフィックを減らします。

仮想マシンの NUMA

Hyper-V では、NUMA 対応ハードウェアで実行されている VM のメモリ アクセスを最適化するための NUMA がサポートされています。 VM を作成すると、Hyper-V はホストの NUMA トポロジを自動的に検出し、仮想 NUMA トポロジを VM に投影します。 既定では、Hyper-V は、基になるホスト コンピューターの NUMA トポロジと一致するように、この仮想 NUMA トポロジを最適化します。

仮想 NUMA トポロジを VM に公開すると、ゲスト オペレーティング システムとその中で実行されている NUMA 対応アプリケーションは、物理コンピューターで実行する場合と同様に、NUMA パフォーマンスの最適化を利用できます。 NUMA に対応していないワークロードは、仮想 NUMA を利用しません。 ただし、ゲスト オペレーティング システムでは、いくつかの NUMA 最適化が実行される場合があります。

ワークロードの観点からは、仮想 NUMA と物理 NUMA の違いはありません。 仮想マシン内で、ワークロードがデータにローカル メモリを割り当て、同じ NUMA ノード内のデータにアクセスすると、基になる物理システムで高速なローカル メモリ アクセスが行われます。 この方法により、リモート メモリ アクセスのパフォーマンス低下を回避できます。

NUMA スパニング

VM を起動すると、Hyper-V は、十分なメモリが使用可能な場合に、1 つの物理 NUMA ノードからその VM のすべてのメモリを割り当てようとします。 既定では、1 つのノードが VM のメモリ要件を満たさない場合、Hyper-V は、 NUMA スパンと呼ばれる別の物理 NUMA ノードからメモリを割り当てます。 NUMA ノード スパニングを有効にすると、Hyper-V ホストでより多くの VM を実行できます。 また、1 つの NUMA ノードで使用できるメモリよりも多くのメモリを VM に提供することもできますが、全体的なパフォーマンスが低下する可能性もあります。 予測可能なパフォーマンスを得るには、VM を 1 つの NUMA ノードに制限できますが、VM の Hyper-V ホストで使用可能なすべてのメモリを使用できない場合があります。

Windows Server 2025 における NUMA スパニングの動作の変更点

NUMA スパンがない場合、VM は 1 つの NUMA ノードで使用可能な論理コアの数までしか使用できません。 たとえば、16 コア VM は 16 コアの NUMA ノードで起動しますが、24 コア VM はその単一の NUMA ノードでは起動しません。 この動作は、NUMA 以外のハードウェア上の VM に合わせて調整されます。 これは、開始、復元、ライブ マイグレーションの操作に影響します。 この動作は、Windows Server 2025 および Windows 11 24H2 で変更されました。

Windows Server 2025 および Windows 11 24H2 以降では、NUMA ノード上の物理コア数よりも多くの仮想コアを必要とする VM を実行する場合は、Hyper-V ホストと VM が NUMA スパンを使用するように構成する必要があります。 ワークロードをベンチマークして、NUMA スパンが要件に適しているかどうかを判断する必要があります。

次の図は、2 つの仮想マシンが Hyper-V ホスト上の物理 NUMA ノードにどのようにマップされるかを示しています。1 つは NUMA ノード上の物理コアの数よりも多くの仮想コアを持ち、NUMA にまたがる必要があります。

物理 NUMA ノードにマップされた 2 つの仮想マシンを示す図。1 つの VM が 1 つのノードに適合します。もう 1 つのノードは 2 つのノードにまたがる。

この図は、2 つの物理 NUMA ノードを持つ Hyper-V ホストを示しています。 1 つ目の仮想マシンの仮想コア数は、1 つの NUMA ノードで使用できる物理コアよりも少ないため、Hyper-V は 1 つの NUMA ノード内にすべての仮想コアとメモリを割り当てます。 2 つ目の仮想マシンでは、1 つの NUMA ノードで使用できるよりも多くの仮想コアが必要であるため、Hyper-V は仮想コアとメモリを両方の物理 NUMA ノードに分散します。 ノード間でのこの分散は、NUMA スパンです。

Windows Server 2025 および Windows 11 24H2 より前は、NUMA ノード上の物理コア数を超える仮想コア数で VM を構成しても、Hyper-V ホスト上の論理コアの総数を超えていなければ、その VM は起動できます。 Hyper-V が仮想コア スレッドを複数の論理コアにまたがってどのようにスケジュールするかによっては、VM のパフォーマンスが予測不能になる可能性があります。 たとえば、24 コア VM は、NUMA ノードの論理コアを共有することで、16 コアの NUMA ノードから開始できます。仮想コアは、時間の経過と同時に異なる論理コアを共有します。

動的メモリと NUMA

仮想 NUMA と動的メモリを同時に使用することはできません。 動的メモリが有効になっている VM には実質的に仮想 NUMA ノードが 1 つだけあり、仮想 NUMA 設定に関係なく VM には NUMA トポロジがありません。 NUMA に対応していない、または複数の物理 NUMA ノードからリソースを消費するのに十分な大きさの VM ワークロードの場合、動的メモリを有効にしてもパフォーマンスが低下することはありません。 ワークロードをベンチマークして、動的メモリが要件に適しているかどうかを判断する必要があります。

次のステップ

NUMA 対応ハードウェアで実行されている仮想マシンのメモリ アクセスとパフォーマンスを最適化するために、Hyper-Vで NUMA を構成する方法について説明します。