动态调整KVM虚拟机内存和vcpu实战

KVM虚拟机可以动态增加和删除vCPU,但是前提条件是,必须在虚拟机offline模式下先设置好最大vCPU数量。动态增加虚拟机的vCPU数量不能超过虚拟机的最大vCPU数量。同样,虚拟机的最大可分配内存大小也是要在虚拟机offline的时候设置。

这里的案例是动态修改DevStack虚拟机arrow-up-right所分配的vCPU和内存。

建议在创建VM的时候,总是先设置好预计VM未来可能分配的最大vCPU数和最大内存量,以免今后系统扩展时无法动态增加虚拟机的vCPU数量和内存大小。例如,可以将每个VM最大vCPU数量设置成物理主机的CPU数量(略微有些超卖),然后在初始化VM设置一个较低的实际分配vCPU数量,以便今后随业务发展而不断动态调整。

  • 首先关闭devstack虚拟机

sudo virsh shutdown devstack
  • 通过virsh dumpxml可以看到当前虚拟机配置

  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  • 通过virsh命令设置虚拟机最大可分配内存32G

sudo virsh setmaxmem devstack 32G

虽然也可以直接编辑xml文件,但是设置内存大小通过命令修改内存大小多少G比较方便

此时再使用virsh dumpxml devstack可以看到如下配置

  <memory unit='KiB'>33554432</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  • 通过virsh edit devstack修改vCPU配置

  <vcpu placement='static' current='1'>12</vcpu>

然后保存并再次通过virsh dumpxml devstack验证配置是否正确。

  • 启动虚拟机

  • 启动虚拟机后,登陆到虚拟机中检查当前虚拟机配置

动态调整

当前我们虚拟机的配置依然是 1 vCPU 2G Memory,现在我们启动devstack程序观察系统负载,可以看到由于虚拟机资源不足,系统负载始终高于3(大于VM的分配vCPU数量)且有swap磁盘交换,所以性能较差。

现在动态给虚拟机增加到4个vCPU

这个动态添加CPU是立即生效的,无需重启guest虚拟机

在虚拟中观察vCPU数量,可以看到已经增加到了4个vCPU,负载过大得到了极大缓解:

同时观察虚拟机系统日志可以看到vCPU数量增加

  • 动态增加虚拟机内存

然后在guest中观察内存分配

可以看到内存立即扩容到8G

··· total used free shared buff/cache available Mem: 7436 828 6468 18 139 6274 Swap: 1023 1022 1 ···

参考

Last updated