一、需求概述
有些特殊的程序针对多 NUMA 通道进行了优化,性能会比单通道要高很多,而在 KVM 虚拟机中,默认是单 NUMA 的,此时,就需要修改 KVM 配置文件,使其支持多 NUMA 通道。
二、前提条件
以 CentOS 7.3 举例,安装完虚拟化套件后(qemu libvirtd virtual-tools等),直接修改虚拟机的 xml 配置文件是不支持多 NUMA 配置的,它有一些前提条件,以下是总结:
- 需要开启嵌套虚拟机功能
cat /proc/cpuinfo | grep vmx
cpuinfo 中支持 vmx- 虚拟机的cpu model 配置成
host-model
三、实践
3.1 开启嵌套虚拟化
### 返回 N 说明不支持嵌套虚拟化,需要修改内核参数
cat /sys/module/kvm_intel/parameters/nested
### 添加配置文件
cat << EOF > /etc/modprobe.d/kvm-nested.conf
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1
EOF
### 载入配置文件,载入前需要确保没有虚拟机在运行
modprobe -r kvm_intel
modprobe -a kvm_intel
### 验证返回结果是否为 Y
cat /sys/module/kvm_intel/parameters/nested
3.2 修改虚拟机配置文件
首先,我们需要导出虚拟机的配置文件,建议使用 virsh
命令,如果没有请自行安装。
以下配置以模拟四个 NUMA 通道,总共 128 逻辑核心,每个通道分配 32 核心,内存大小总共128G举例:
### 查看所有虚拟机名称
virsh list --all
### 导出虚拟机配置文件
virsh dumpxml <your_vm_name> > vm.xml
导出配置文件后,进行修改,主要修改以下位置的配置(cpu标签中的配置进行修改):
<cpu mode='host-model'>
<model fallback='allow'>
<topology sockets='1' cores='128' threads='1'/>
<numa>
<cell id='0' cpus='0-31' memory='32' unit='GiB'/>
<cell id='1' cpus='32-63' memory='32' unit='GiB'/>
<cell id='2' cpus='64-95' memory='32' unit='GiB'/>
<cell id='3' cpus='96-127' memory='32' unit='GiB'/>
</numa>
</cpu>
注意:主要是添加了 <numa>
标签,总共4个 cell
,每个 cell
分配32逻辑核心,以及总内存的 1/4
修改完成后,导入修改后的配置文件,启动虚拟机
virsh define vm.xml
virsh start <your_vm_name>