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

虚拟机开启NUMA如何优化性能?配置步骤详解,NUMA性能调优技巧

导读虚拟机开启NUMA的核心收益是让vCPU和内存尽量落在同一个物理NUMA节点内,减少跨节点访问延迟,从而提升数据库、高并发计算等场景的性能;具体配置需在宿主机BIOS开启NUMA,并在虚拟化层完成节点拓扑透传和vCPU绑定,为什么虚拟机默认没享受到NUMA红利物理服务器的NUMA架构早已是标配,一颗物理CPU内……

虚拟机开启NUMA的核心收益是让vCPU和内存尽量落在同一个物理NUMA节点内,减少跨节点访问延迟,从而提升数据库、高并发计算等场景的性能;具体配置需在宿主机BIOS开启NUMA,并在虚拟化层完成节点拓扑透传和vCPU绑定。

为什么虚拟机默认没享受到NUMA红利

物理服务器的NUMA架构早已是标配,一颗物理CPU内部的内存控制器直接管理一部分内存条,CPU访问本地内存比访问远端CPU管理的内存快得多,这个“本地内存”和“远端内存”的延迟差距,就是NUMA存在的意义。

但虚拟机默认情况下并不感知这个拓扑,虚拟化层通常会把vCPU和内存打散分配,甚至把虚拟机的内存跨多个NUMA节点分布,当虚拟机里的应用频繁访问远端内存时,性能损失会随着内存带宽压力增大而迅速放大。

行业共识认为,跨节点内存访问的延迟差通常在1.5到2倍之间,对于延迟敏感型应用,这个差距会直接反映在业务响应时间上。

虚拟机开启NUMA性能提升多少先看清瓶颈在哪

没有固定的百分比数字,因为收益取决于工作负载的内存访问模式和虚拟化平台的具体实现,但可以从典型场景中感受差距。

哪些场景收益明显

  • 数据库类负载(MySQL、PostgreSQL、Oracle):大量随机小数据块访问,内存延迟直接决定事务响应速度,开启NUMA后,事务处理能力通常有明显改善。
  • 内存计算类场景(Redis、Memcached、大数据分析):对内存带宽极为敏感,跨节点访问会拉高延迟,本地化后吞吐更稳定。
  • 高频交易和实时风控系统:这类应用的性能抖动比平均性能更致命,NUMA拓扑感知能显著降低尾部延迟。

哪些场景可能“负优化”

  • 虚拟机vCPU数量超过单个物理NUMA节点的CPU核心数时,虚拟化层会自动把虚拟机拆分到多个NUMA节点,此时vCPU绑定的收益会大打折扣。
  • vCPU与内存比例严重失衡,比如1核心配8GB以上内存时,内存可能被迫分布在远端节点,性能反而下降。
  • CPU密集型但内存访问量极轻的工作负载,受益有限,配置不当还可能引入调度限制。

虚拟机NUMA配置与内存分配最佳实践

配置的核心思路是保证两点:虚拟机能看到真实的NUMA拓扑,虚拟机的内存分配优先落在本地节点。

KVM环境配置与命令

KVM是开源场景最常用的虚拟化方案,配置路径较直接。

第一步:确认宿主机NUMA拓扑

numactl --hardware
```bash

输出会列出节点编号、每个节点的CPU范围和内存范围,记下这些信息。

第二步:配置虚拟机XML

编辑虚拟机的XML配置文件,在<cpu>标签内加入NUMA拓扑定义:

<cpu mode='host-passthrough' check='none'>
  <numa>
    <cell id='0' cpus='0-3' memory='16' unit='GiB'/>
    <cell id='1' cpus='4-7' memory='16' unit='GiB'/>
  </numa>
</cpu>

cpus对应vCPU编号,memory对应每个节点的内存大小,这里的关键是让虚拟机的节点拓扑和物理节点对齐。

第三步:内存绑定到本地节点

virsh numatune vhost-node1 --nodeset 0

此命令指定整个虚拟机的内存优先从物理节点0分配,如果虚拟机配置了多个NUMA节点,可以对每个节点分别设置:

virsh numatune vhost-node1 --nodeset 0-1 --mode strict

strict模式确保内存只从指定节点分配,宁缺毋滥。

第四步:vCPU绑定到物理核心

virsh vcpupin vhost-node1 0 0
virsh vcpupin vhost-node1 1 1
virsh vcpupin vhost-node1 2 2
virsh vcpupin vhost-node1 3 3

将vCPU 0绑定到物理CPU 0,逐个对应,更合理的方式是查看lscpu输出,确认每个NUMA节点包含哪些物理核心,再做映射。

VMware环境配置步骤

VMware vSphere的配置相对简单,但需要留意ESXi的默认行为。

第一步:开启CPU热插拔和NUMA感知

在vSphere Web Client中,编辑虚拟机设置,进入“虚拟机选项”标签页,展开“高级”→“配置参数”,确认以下参数存在且值正确:

  • numa.vcpu.maxPerVirtualNode:建议设置为物理节点的核心数
  • numa.vcpu.min:建议设置为虚拟机vCPU总数
  • cpuid.coresPerSocket:建议为每个虚拟插槽设置与物理节点核心数一致的核数

第二步:预留内存和设置亲和性

在“虚拟机硬件”页面,展开“内存”,将“预留所有客户机内存”勾选,这一步很关键,内存预留能让ESXi在创建虚拟机时就直接从固定节点分配物理内存,避免后续内存交换导致跨节点访问。

第三步:验证虚拟机内的NUMA识别

登录虚拟机操作系统,执行:

numactl --hardware

确认虚拟机的节点数与宿主机的物理NUMA节点数一致,且各节点的CPU分布合理。

虚拟机跨NUMA节点性能对比:测试方法

配置完成后建议做一次前后对比,方法不复杂。

压力测试工具选型

  • mbw:测试内存复制带宽,适合查看跨节点访问的性能损失
  • lmbench 的 lat_mem_rd:测试内存读延迟,直接反映NUMA影响
  • sysbench memory:测试综合内存性能,更贴近真实应用

测试思路

先在未配置NUMA的情况下做基线测试,获取延迟和带宽数据,然后完成配置,重启虚拟机再测一次,对比两组数据,重点关注延迟指标,节点间访问的延迟差异最直观。

判断标准

  • 内存读延迟下降10%以上,说明优化有效
  • 带宽提升不明显但延迟下降,依然有价值
  • 如果延迟没有变化,检查是否启用了vCPU绑定,以及物理节点间是否独立

配置过程中常见问题排查

虚拟化层版本不兼容

部分旧版本虚拟化软件不支持NUMA拓扑透传,KVM环境下执行virsh capabilities查看输出的NUMA信息,确认有<topology>块,VMware环境下确认ESXi版本在6.0以上,且虚拟机硬件版本不低于10。

vCPU数量超过CPU宽度

虚拟机的vCPU数量超过物理单节点核心数时,虚拟化层会强制拆分虚拟机到多个NUMA节点,原有的单节点配置失效,此时需要调整虚拟机vCPU数量,或者接受跨节点访问的现实。

超线程的干扰

开启超线程的物理机在绑定vCPU时,务必确认绑定的是同一物理核心的不同线程,还是不同物理核心,绑定到同一物理核心的两个线程会造成资源争抢,查看lscpu -e输出,关注CORE列。

虚拟机开启NUMA相关问题解答

开启NUMA后虚拟机性能不升反降怎么回事?

优先检查vCPU绑定的物理核心是否都属于同一个NUMA节点,或者虚拟机vCPU总数超过物理节点核心数,还有一种常见情况是宿主机开启了超线程,但绑定时没有区分物理核心,导致两个vCPU共享同一物理核心。

如何在Windows虚拟机内确认NUMA是否生效?

Windows没有内置的numactl命令,打开任务管理器,“性能”标签页中查看“NUMA节点”是否出现,或者使用Coreinfo工具查看vCPU与节点的映射关系,如果只有一个节点,说明虚拟机未感知到NUMA拓扑。

NUMA和CPU亲和性是一回事吗?

不是,CPU亲和性(vCPU绑定)是告诉虚拟化层“只允许vCPU运行在指定物理CPU上”,它解决的是调度问题,NUMA优化解决的是内存访问本地化问题,两者配合使用才能获得完整性能提升,只做亲和性而不配置NUMA拓扑,内存仍然可能落在远端节点。

虚拟机NUMA优化的核心就三步:透传拓扑、内存绑节点、vCPU绑核心,数据库和高并发应用看延迟指标,计算密集应用看带宽指标,各有侧重,配置完成后用numactl和mbw做好前后对比,用数据验证效果。

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