KVM NUMA 亲和配置
在多路(多 NUMA 节点)宿主上,CPU 访问本节点内存比访问远端节点内存快得多。把虚机内存固定在指定 NUMA 节点,并配合把 vCPU 绑定到该节点的核心,可以显著减少远端内存访问。查看与热改用 virsh numatune,持久定义写在域 XML 的 numatune 段。
基本信息
| 查看拓扑 | virsh nodeinfo、numactl --hardware、lstopo 均可查看节点与核心分布 |
|---|---|
| 命令查看 | virsh numatune vm1 查看当前绑定策略 |
| 限制节点 | virsh numatune vm1 --mode strict --nodeset 0 指定节点 |
| XML 段 | 在域定义中写 numatune 段落声明内存模式与节点集合 |
| 配套动作 | 与 vcpupin 绑核配合使用:内存绑节点、vCPU 绑该节点内的核 |
典型使用场景
- 数据库虚机调优:内存访问延迟直接影响查询响应
- 内存密集计算:减少跨节点访问以提升吞吐
- 多虚机隔离:把不同虚机分散到不同节点,避免互相抢占
- 性能基准对比:验证 NUMA 亲和带来的实际收益
- 宿主规划:按节点容量规划虚机分布,而不是只看总核数
查看与热调整
查看与热调整
numactl --hardware # 宿主 NUMA 拓扑与各节点内存
virsh numatune vm1 # 查看当前内存绑定
virsh numatune vm1 --mode strict --nodeset 0 --live
virsh vcpupin vm1 # 查看 vCPU 与物理核的对应
# XML 片段:<numatune><memory mode='strict' nodeset='0'/></numatune>模式对比
| 模式 | 行为 | 适用 |
|---|---|---|
| strict | 只在指定节点分配内存 | 追求确定性,内存不足则失败 |
| preferred | 优先指定节点,不足时回退 | 兼顾亲和与启动成功率 |
| interleave | 在多个节点间轮转分配 | 带宽优先、单点压力平均 |
NUMA 亲和与绑核通常配合使用:内存绑节点、vCPU 绑该节点内的核,只做其中一项,收益会被另一侧的远端访问抵消。
strict 模式下节点内存不足会直接导致虚机启动失败:调整前先核对节点可用内存与虚机内存是否匹配。
改动后要用真实业务或贴近业务的压测验证效果,NUMA 亲和并非对所有负载都有收益,盲目套用参数可能反而降低灵活性。
虚拟 NUMA 拓扑是另一条路径:把虚机自身声明成多节点结构,配合 guest 内调度能更贴合宿主布局,但它会改变 guest 看到的内存结构,需要按业务实测后再启用。