Skip to content

virsh 热扩容 CPU/内存受限与重启扩容实战

以 sza122030 由 4C8G 扩容为 8C32G 为例,说明 KVM 热扩容的前提条件、典型报错,以及「调整上限 + 重启」的标准扩容流程。

背景

虚拟机 sza122030(192.168.122.30)运行中,规格 4C8G,业务需要扩容为 8C32G,且希望不中断业务热扩容

热扩容尝试与报错

直接在线扩容:

bash
virsh setvcpus sza122030 8 --live
virsh setmem sza122030 32G --live

报错:

error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 8 > 4
error: invalid argument: cannot set memory higher than max memory

根因:上限(Max)锁死

此前对该机做降配时,setvcpus --maximumsetmaxmem 一并降到了 4 vCPU / 8G:

bash
virsh dominfo sza122030 | grep -E 'CPU|memory'
# CPU(s):         4
# Max memory:     8388608 KiB   ← 上限只有 8G

KVM/libvirt 的硬限制:

  • 在线扩容不能超过 Max 上限(vCPU 与内存同理)
  • Max 上限本身不支持在线修改,必须改写持久配置(--config)并完全关机再启动(重建 QEMU 进程)

⚠️ virsh reboot 无效:它只是向 Guest 发重启信号,QEMU 进程不重建,新配置不会加载。必须 shutdownstart

标准扩容流程(调整上限 + 重启)

1. 调整持久配置上限与当前值

bash
virsh setvcpus sza122030 8 --config --maximum   # 最大 vCPU
virsh setvcpus sza122030 8 --config             # 当前 vCPU
virsh setmaxmem sza122030 32G --config          # 最大内存
virsh setmem sza122030 32G --config             # 当前内存

2. 优雅关机(ACPI)

bash
virsh shutdown sza122030
# 轮询等待,实测 15 秒完成
until [[ "$(virsh domstate sza122030)" == "shut off" ]]; do sleep 3; done

3. 重新启动并验证

bash
virsh start sza122030
virsh dominfo sza122030 | grep -E 'State|CPU|memory'

验证输出:

State:          running
CPU(s):         8
Max memory:     33554432 KiB
Used memory:    33554432 KiB

启动后 15 秒 ping 通,业务恢复,全程停机约 20 秒。

经验总结

  1. 降配时慎降上限:如果未来可能再扩容,降配时可只降当前值(setmem/setvcpus 不加 --maximumsetmaxmem 不动),为在线扩容保留上限冗余。
  2. 热扩容三前提:Guest 内核支持 CPU/内存热插拔 + 上限有冗余 + 使用 --live(需持久化则加 --config)。
  3. 报错即信号greater than max allowable vcpus / cannot set memory higher than max memory 说明上限锁死,只能走「改上限 + 关机启动」流程。
  4. 关机启动 ≠ reboot:配置变更必须由 QEMU 进程重建加载,virsh reboot 不生效。

相关文档