XenServer 9 における NUMA の最適化
概要
Non-Uniform Memory Access (NUMA) は、メモリが特定の CPU ソケットに接続されたノードに分割されるマルチプロセッサメモリアーキテクチャです。ローカル NUMA ノード上のメモリにアクセスする方が、リモートノード上のメモリにアクセスするよりもレイテンシが低くなります。VM の vCPU とそのメモリが同じ NUMA ノードに配置されている場合、ワークロードはメモリアクセスレイテンシを低減し、パフォーマンスを向上させることができます。
UMA と NUMA の比較
-
UMA (Uniform Memory Access) ホストは、単一の物理メモリノードを CPU に提示します。
-
NUMA ホストは複数のメモリノードを公開します。CPU は、リモートノードからメモリにアクセスするよりも、ローカルノードからメモリにアクセスする方がレイテンシが低くなります。
最適化された NUMA 配置の利点
-
アプリケーションの応答性とワークロードのスループットが向上します。
-
ホストあたりの VM 密度が高くなり、追加のホストの必要性と全体的なインフラストラクチャコストが削減されます。
制限事項
-
ホスト上の単一の NUMA ノードに VM 用の十分な空きメモリがない場合、XS9 は VM を起動できるように、複数のノードにメモリを分散させて VM を起動します。
-
メモリが分散されている場合、VM は複数の NUMA ノード (
NUMA nodes > 1) を使用し、NUMA 最適化されていません。 -
パフォーマンスの向上は、ワークロード、ベンチマーク、CPU タイプによって異なります。
監視とトラブルシューティング
VM ごとの RRD メトリック (デフォルトでは無効) は、NUMA の動作と vCPU スケジューリングの監視に役立ちます。
メトリック
-
NUMAノード (
numa_nodes): VMが使用するNUMAノードの数。値1は最適化されていることを示し、1より大きい値は最適化されていないことを示します。 -
メモリNUMAノードX (
memory_numa_node_X): 物理NUMAノードXから割り当てられたVMメモリの量。値0はそのノードからメモリが割り当てられていないことを意味します。 -
vCPU実行可能(いずれか) (
runnable_any): 少なくとも1つのvCPUが準備完了状態にあるが、pCPUが利用できない時間の割合。これはCPU競合の初期指標です。 -
vCPU実行可能(合計) (
runnable_vcpus): スケジューリング遅延によるすべてのvCPUの予想されるパフォーマンス低下率。 -
NUMA非アフィニティvCPU (
numa_node_nonaffine_vcpus): vCPUがVMメモリと同じNUMAノードにないpCPUで実行される時間の割合。値が高いほど、メモリアクセス遅延が増加していることを示します。
デバッグチェックリスト
-
NUMA nodesを確認して、VMがいくつのNUMAノードを使用しているかを確認します。 -
vCPUs runnable anyでドメインレベルのスケジューリング競合を確認します。 -
vCPUs runnable sumでvCPUレベルのスケジューリング遅延を確認します。 -
NUMA non-affine vCPUsでNUMAアフィニティ違反と関連する遅延を確認します。
メトリックを有効にしてサンプルをエクスポートする
VMごとのRRDメトリックはデフォルトで無効になっています。VMのメトリック(例:
runnable_any)を有効にしてサンプルをエクスポートするには:
# Enable the data source for a VM
xe vm-data-source-record uuid=<vm-uuid> data-source=runnable_any
# Export sample RRD output
rrd2csv VM:AVERAGE::runnable_any
NUMA配置を構成する (xe CLI)
NUMA配置最適化はXS9ホストでデフォルトで有効になっています。有効にするためにアクションは必要ありません。
ホストでNUMA配置最適化を無効にするには、ホストのNUMAアフィニティポリシーを
anyに設定します。
# View current policy
xe host-param-get uuid=<host-uuid> param-name=numa-affinity-policy
# Disable optimization
xe host-param-set uuid=<host-uuid> numa-affinity-policy=any
# Verify
xe host-param-get uuid=<host-uuid> param-name=numa-affinity-policy
デフォルトで有効になっている場合、ポリシー値は
default_policyです。無効になっている場合、値はanyです。