九:如何在线添加/移除虚拟机的vCPU

KVM支持vCPU热插拔么?Linux KVM虚拟机能够感知到新添加的vCPU么?答案当然是"YES"。

类似KVM 内存管理,你可以使用virsh命令给正在运行的VM添加或删除vCPU。不过,这个工作是需要预先配置KVM虚拟机的最大vCPU参数才能使用。所以当部署一个新的虚拟机,你应该首先考虑这个参数。给KVM虚拟机设置最大vCPU数量并不会对资源有所小号,因为虚拟机只会使用分配的vCPU。

理解VM的vCPU配置

  • 列出KVM主机配置的VM

[root@UA-HA ~]# virsh list  --all
 Id    Name                           State
----------------------------------------------------
  -     UAKVM2                         shut off

[root@UA-HA ~]#
  • 检查当前VM配置

[root@UA-HA ~]# virsh dumpxml UAKVM2 | grep vcpu
  <vcpu placement='static' current='1'>2</vcpu>

以上显示这个VM当前使用1个vCPU,并且可以通过virsh vsetcpus命令增加vCPU。但死你不能在VM运行时增加超过2个vCPU。

  • 现在我们启动VM

[root@UA-HA ~]# virsh start UAKVM2
Domain UAKVM2 started

[root@UA-HA ~]#
  • 登陆到KVM虚拟机并检查分配的vCPU数量:

向运行的KVM虚拟机增加vCPU

  • 切换到KVM主机并使用virsh命令增加vCPU,从1增加到2

  • 返回到KVM guest虚拟机,检查新添加的vCPU。此时VM从UP code(uniprocessor)切换到SMP code (symmetric multiprocessor)

  • 如果想配置永久生效,保存VM配置

现在我们已经成功给KVM虚拟机添加了vCPU并使配置永久生效。

从运行的KVM虚拟机去除vCPU

没有直接从KVM guest虚拟机直接移除vCPU的方法。但是可以通过禁止CPU核心方式将CPU核心的性能返还给KVM主机。

  • 登陆到KVM host主机

  • 假设当前KVM guest虚拟机UAKVM2有2个活动的vCPU

  • 注意不要使用以下命令来移除vCPU,你会收到错误消息error: internal error: cannot change vcpu count of this domain

  • 使用以下命令来缩减UAKVM2的vCPU数量(vCPU从2缩减到1)

  • 保存VM配置

  • 登陆到KVM guest虚拟机UAKVM2验证

注意:

在KVM物理主机中过,你依然会看到两个vCPU呗分配给虚拟机UAKVM2,只有重启VM才会生效。

  • 关闭UAKVM2 KVM虚拟机并验证

此时可以看到vCPU被修改成1个。

如果尝试添加比预分配更多的vCPU会看到如下错误信息error: invalid argument: requested vcpus is greater than max allowable vcpus for the domain

请重新参考前述的"理解VM vCPU配置"段落。使用virsh命令不能超过vCPU最大配置数量。这个最大vCPU数量不能在虚拟机运行时修改。

如何修改每个虚拟机的最大vCPU数量?(只能使用offline模式)

  • 作为root用户登陆到KVM host主机

  • 优雅地停止虚拟机

  • 编辑VM配置类似如下,这里将最大vCPU数量从2修改成4:

修改成

vCPU XML 格式:

这里N时当前激活的CPU数量,而M是CPU的最大数量

  • 启动KVM虚拟机UAKVM2

  • 验证UAKVM2虚拟机的vCPU信息

如上所述,此时UAKVM2只分配了1个vCPU。由于我们配置了vCPU最大数量是4,所以我们可以动态将虚拟机的vCPU增加到4个。

  • 增加vCPU数量到4

  • 登陆到KVM虚拟机UAKVM2中并列出vCPU

以上我们已经在离线情况下成功增加了最大vCPU数量,并在VM运行时增加了分配到vCPU。

系列教程编译

本系列教程根据 UnixArena Linux KVM 系列教程编译,共分以下文章:

Last updated

Was this helpful?