关键是要让vcpu和内存严格落在同一物理numa节点内,避免跨节点访问致延迟从80ns升至300ns+;须先用get-numanode确认物理拓扑,再按节点核心数与内存容量匹配配置vcpu数量、内存大小及set-vmprocessor参数。
要让 hyper-v 虚拟机真正发挥 numa 架构的性能优势,关键不是“开了 numa”就行,而是让虚拟 cpu 和内存严格落在同一个物理 numa 节点内——避免跨节点访问带来的延迟飙升(从约 80ns 升至 300ns+)。配置本身不难,但需先看清物理拓扑,再按需对齐。
查清宿主机真实 NUMA 结构
盲目设置会适得其反。必须先确认物理服务器的 NUMA 节点数量、每个节点的 CPU 核心数和内存容量:
- 在 Hyper-V 主机上运行 PowerShell 命令:Get-NumaNode,直接列出所有 NUMA 节点及其关联的逻辑处理器与内存大小
- 结合任务管理器 → 性能 → CPU → 右下角“NUMA 节点”数量,或使用 coreinfo -n(Sysinternals 工具)交叉验证
- 例如:双路 Intel Xeon Silver 4310 服务器,通常呈现 2 个 NUMA 节点,每节点 12 核 + 128GB 内存
创建或修改 VM 时匹配物理节点粒度
Hyper-V 默认会尝试自动映射,但高负载 VPS 场景下必须手动干预:
- 新建虚拟机时,在“处理器”设置页勾选启用 NUMA,并设置“最大处理器数量”≤单个物理 NUMA 节点的核心数(如 12)
- 内存分配建议为 NUMA 节点容量的整数倍(如节点为 128GB,则 VM 分配 64GB 或 128GB,避免 96GB 这类非对齐值)
- 已有虚拟机可通过 PowerShell 精确绑定:Set-VMProcessor -VMName "DB-VM" -NumaSocketCount 1 -NumaNodeCount 1,强制其只使用一个物理插槽内的资源
慎用跨节点与动态内存
跨 NUMA 节点运行或启用动态内存,极易引发远程内存访问和频繁重平衡:
- 单台 VM 的 vCPU 数量超过单节点核心数时,宁可拆分为多个小 VM,也不建议设为跨节点大 VM(如 24 vCPU 应分两个 12vCPU VM)
- 数据库、Exchange 等关键负载务必禁用动态内存,改用固定内存;最小内存值必须 ≥ 所属 NUMA 节点容量的最小整数单位(如节点 128GB,最小内存至少设 128GB)
- 用性能监视器跟踪Memory\Hard Page Faults/sec,持续偏高往往意味着 NUMA 映射失败或内存被强制迁移
验证与微调
配置完不是终点,要进 Guest OS 验证是否真正感知到 vNUMA:
- Windows Guest 中打开任务管理器 → 性能 → CPU → 查看右下角是否显示多个 NUMA 节点
- Linux Guest(如 Ubuntu)中执行 numactl --hardware,确认节点数、CPU 绑定及本地内存大小
- 若发现 vCPU 分布跨节点,或某节点内存远高于其他节点,回退检查 Set-VMProcessor 中的 -NumaNodeCount 与 -NumaSocketCount 参数是否一致











