使用libvirt绑定numa node

初学libvirt,感觉还挺方便的。它能够像daemon一样运行一个稳定的VM,相比直接用qemu命令行是方便多了。这里记录一下我如何绑定numa node。

不知道能不能直接在创建虚拟机的时候绑定numa,我是在xml中设置的。

安装libvirt,略去。在host上创建一个网桥,libvirt以它上网,我这里命名为virbr0.

首先创建一个vm。

sudo virt-install \
  --connect qemu:///system \
  --name myvm \
  --memory 8192 \
  --vcpus 4 \
  --disk path=../AnolisOS-8.9-x86_64-RHCK.qcow2,size=2048,format=qcow2 \
  --network bridge=virbr0 \
  --os-type linux \
  --virt-type kvm \
  --boot hd \
  --graphics none \

这样起的虚拟机是可以交互的,但是VM并不依赖于当前的bash,即使当前的bash挂掉也不影响VM,可以通过ssh登陆,当然前提是VM有网。当前的VM起来后只有一个numa,4个cpu,而且没有绑定到物理numa上。我们可以使用virsh edit手动设置。

sudo virsh edit myvm

创建两个numa,每个numa包含2个cpu,4G内存。

  <cpu mode='host-model' check='partial'>
    <numa>
      <cell id="0" cpus="0-1" memory="4" unit="GiB"/>
      <cell id="1" cpus="2-3" memory="4" unit="GiB"/>
    </numa>
  </cpu>

将numa绑定到物理numa上。假如我们的host上有至少2个numa。

  <numatune>
    <memnode cellid="0" mode="strict" nodeset="0"/>
    <memnode cellid="1" mode="strict" nodeset="1"/>
  </numatune>

将VM中的numa0绑定到物理机的numa0,numa1绑定到物理机的numa1.

更进一步,我们可以将vcpu绑定到物理cpu。

<cputune>
    <vcpupin vcpu="0" cpuset="0"/>
    <vcpupin vcpu="1" cpuset="1"/>
    <vcpupin vcpu="2" cpuset="8"/>
    <vcpupin vcpu="3" cpuset="9"/>
  </cputune>

这里vcpu2需要绑定到numa1的第一个cpu,vcpu3绑定到numa1的第二个cpu。这里简单用8,9代替,实际以你的物理机拓扑为准。

这样VM中的numa,vcpu都绑定到了物理numa,cpu上。

保存xml,重启VM。

sudo virsh destroy myvm
sudo virsh start myvm

进入VM使用lstop,lscpu查看一下VM的numa拓扑。使用stress让所有cpu跑满,到host上使用top验证一下绑定cpu是否成功。

接下来再研究一下如何将设备相关的资源绑定到指定的numa上。

 

posted @ 2024-05-07 10:31  半山随笔  阅读(73)  评论(0编辑  收藏  举报