服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-27 简米科技 3,511 字 8 分钟阅读

虚拟机开启NUMA如何优化性能?配置步骤有哪些?虚拟机NUMA性能调优教程

导读虚拟机开启NUMA后的性能收益并非由单一开关决定,而取决于物理拓扑识别、vCPU/内存亲和性绑定、GuestOS内部调优三者的协同配合,完整配置链路包含宿主机BIOS、Hypervisor层、虚拟机参数三层共七个关键步骤,虚拟机开启NUMA到底提升了哪部分性能很多管理员把NUMA当成一个简单的加速开关,实际上它……

虚拟机开启NUMA后的性能收益并非由单一开关决定,而取决于物理拓扑识别、vCPU/内存亲和性绑定、GuestOS内部调优三者的协同配合,完整配置链路包含宿主机BIOS、Hypervisor层、虚拟机参数三层共七个关键步骤。

虚拟机开启NUMA到底提升了哪部分性能

很多管理员把NUMA当成一个简单的加速开关,实际上它改变的是内存访问路径。在NUMA架构下,每个CPU都有自己的本地内存,跨Node访问内存的延迟要比本地访问高出不少,虚拟机开启NUMA之后,vCPU和内存会被尽量约束在同一个物理Node上,绕开跨Node访问的惩罚,这才是性能提升的本质。

NUMA拓扑对虚拟机性能的核心影响

VMware vSphere和KVM在默认情况下,虚拟机只看到一个平坦的内存空间,当虚拟机内存超过物理Node容量,或者CPU调度被分配到远端Node时,内存访问延迟会明显拉长。行业共识认为,跨Node内存访问的延迟比本地访问高出约50%左右,在内存密集型负载中这个差距会被进一步放大。

开启NUMA后,虚拟机通过vNUMA拓扑感知物理Node边界,以常见的双路服务器为例,两颗CPU各带一组内存通道,如果虚拟机只使用一个Node的资源,所有内存访问都走本地通道,延迟自然降下来。

哪些场景开启NUMA收益最明显

不是所有虚拟机都需要开启NUMA,数据库、ERP这类内存占用大且频繁读写的工作负载,收益最强,而轻量级Web服务器,内存占用小,CPU压力低,开不开NUMA基本感知不到区别。

满足下面任一条件的虚拟机,建议开启:

  • 内存规格超过单个物理Node容量一半,比如物理Node有512GB内存,虚拟机配了256GB以上
  • 业务负载高度依赖内存访问,例如Oracle数据库、SAP HANA、Redis缓存
  • 物理机是双路及以上配置,且启用了大页内存(HugePages)

虚拟机开启NUMA完整配置步骤:从宿主机到GuestOS

下面这套流程覆盖VMware和KVM两种主流虚拟化平台,按照从底层到上层的顺序推进,每个步骤都有明确的操作路径。

第一步:宿主机BIOS开启NP

进到服务器BIOS界面,找到Processor Settings菜单,把NUMA Nodes Per Socket(NPS)从”Auto“固定为NPS=1或NPS=2,具体取值看物理CPU的架构,AMD EPYC处理器建议NPS=2,Intel Xeon平台使用NPS=1即可。

保存重启,进入操作系统后用numactl --hardware命令确认物理拓扑,输出信息里每个node对应一个CPU和一段内存,这就是虚拟机NUMA调优的物理基础。

第二步:Hypervisor层开启虚拟NUMA

VMware vSphere平台操作路径:选中虚拟机,右键编辑设置,依次展开CPU和内存,勾选“在客户机操作系统中公开NUMA拓扑(Expose NUMA topology to guest OS)”,这个选项在vSphere 7.0及以上版本默认自动开启,但老版本需要手动勾选,而且必须满足两个前提:虚拟机硬件版本不低于14,CPU热插拔未启用。

KVM平台典型场景,使用virsh命令时在XML配置文件的<cpu>标签中添加:

<numa>
  <cell id='0' cpus='0-3' memory='34359738368' unit='KiB'/>
</numa>

同时把<vcpu placement='static' cpuset='0-3'>设置成包含物理CPU的整数集,才能保证vCPU不会调度到远端Node上。

第三步:虚拟机和物理Node的亲和性绑定

这一步决定vCPU跑在哪颗物理CPU上,在KVM中,使用virsh vcpupin命令把虚拟机的vCPU绑定到对应物理CPU核心:

virsh vcpupin vm-name 0 0-3
virsh vcpupin vm-name 1 4-7

VMware则是在虚拟机高级参数中增加numa.vcpu.maxPerVirtualNode,推荐值设为每个物理Node上的物理核心数的一半到四分之三,举个例子,如果物理Node有32核,那么每虚拟Node最多绑8到24个vCPU,剩余的留给Hypervisor调度余量。

第四步:GuestOS内部接纳vNUMA拓扑

Windows虚拟机需要在设备管理器 > 处理器中确认能看到多个NUMA节点,Linux虚拟机执行:

lscpu | grep NUMA

输出结果要是显示有多个NUMA node,说明vNUMA拓扑已经透传进来了,为了让GuestOS更高效地使用vNUMA,Linux还需要把内存分配策略改成interleave=all之外的preferred本地优先策略:

echo 1 > /proc/sys/vm/numa_balancing

这一步开启内核对访问远端内存页的自动迁移能力,让热内存页逐步迁回到本地Node。

虚拟机NUMA配置中的常见坑和排查思路

实际操作中,配置完NUMA后性能不升反降的情况并不少见,多数情况下问题出在配置链路不完整,或者底层拓扑和虚拟机规格不匹配。

大页内存与NUMA的优先级关系

开启NUMA前建议先确认HugePages配置,在Linux宿主机上,HugePages是独立于NUMA分配器的内存池,如果大页内存没有按Node比例分配,就能看到某个Node的大页耗尽而另一个Node空闲,KVM平台需要在启动参数中追加:

default_hugepagesz=1G hugepagesz=1G hugepages=64

这样每个Node各分到32个大页,与vNUMA的Node划分保持一致。

开启NUMA后性能反而下降的排查清单

依次检查下面四个环节,基本能定位问题:

  • 确认虚拟机CPU数量不超过物理Node的核心总数,如果虚拟机使用了24个vCPU,但物理Node只有16核,内存访问必然跨越Node
  • 确认物理机的超线程没有关闭,开启超线程会让NUMA拓扑的CPU编号变得不连续,影响亲和绑定的准确性
  • 确认虚拟机的内存预留(Memory Reservation)设置为100%,否则Hypervisor可能把内存换到远端Node
  • 确认同一台宿主机上没有超卖严重的其他虚拟机抢占vCPU

附录:常用NUMA检测命令和调优参数速查

操作对象 命令路径 推荐参数
查看物理CPU拓扑 lscpu -e 关注NODE列
查看内存分配策略 cat /proc/sys/vm/numa_balancing 1
绑定QEMU进程到Node numactl --cpunodebind=0 --membind=0 与vCPU绑定一致
ESXi确认vNUMA esxcli vm process list 检查NUMA节点数

迁移虚拟机时需要注意NuMA架构的差异,如果VM是从单路物理机迁移到双路物理机,vNUMA拓扑会自动重新适配;但如果从双路物理机迁移到单路物理机,vNUMA拓扑会自动消失,内存本地性会暂时失效,需要重新调整配置文件。

虚拟机NUMA配置高频问题解答

虚拟机开启NUMA怎么设置才能不影响其他业务?
建议优先使用CPU亲和性绑定,把虚拟机的vCPU固定在专用的核心上,同时配置内存预留避开CPU抢占,Hypervisor的资源共享设置保持默认值,这样NUMA优化只约束本虚拟机的调度范围,不会影响宿主机上其它虚拟机。

物理机只有一颗CPU还有必要配置NUMA吗?
单路CPU平台不涉及跨Node访问问题,开启NUMA反而会增加一层拓扑映射的开销,此类场景直接保持默认值关闭状态更合理,把精力放到存储和网络I/O的调优上。

Linux虚拟机NUMA配置和Windows有区别吗?
Linux的NUMA控制粒度更细,通过numactl能精确调整内存分配策略,适合深度调优,Windows更依赖Hypervisor层的自动调度,手动干预窗口相对有限,生产环境做数据库选型时,优先考虑在Linux上运行并手动绑定NUMA策略。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱