一、需求概述

有些特殊的程序针对多 NUMA 通道进行了优化,性能会比单通道要高很多,而在 KVM 虚拟机中,默认是单 NUMA 的,此时,就需要修改 KVM 配置文件,使其支持多 NUMA 通道。

二、前提条件

以 CentOS 7.3 举例,安装完虚拟化套件后(qemu libvirtd virtual-tools等),直接修改虚拟机的 xml 配置文件是不支持多 NUMA 配置的,它有一些前提条件,以下是总结:

  1. 需要开启嵌套虚拟机功能
  2. cat /proc/cpuinfo | grep vmx cpuinfo 中支持 vmx
  3. 虚拟机的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>

3.3 验证效果

kvm01.png

END
本文作者:
文章标题: KVM虚拟机模拟多个CPU NUMA通道
本文地址: https://blog.imwlw.com/archives/12/
版权说明:若无注明,本文皆 ITShare Studio 原创,转载请保留文章出处。
最后修改:2025 年 01 月 24 日
如果觉得我的文章对你有用,请随意赞赏