主题
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 --maximum 与 setmaxmem 一并降到了 4 vCPU / 8G:
bash
virsh dominfo sza122030 | grep -E 'CPU|memory'
# CPU(s): 4
# Max memory: 8388608 KiB ← 上限只有 8GKVM/libvirt 的硬限制:
- 在线扩容不能超过 Max 上限(vCPU 与内存同理)
- Max 上限本身不支持在线修改,必须改写持久配置(
--config)并完全关机再启动(重建 QEMU 进程)
⚠️
virsh reboot无效:它只是向 Guest 发重启信号,QEMU 进程不重建,新配置不会加载。必须shutdown→start。
标准扩容流程(调整上限 + 重启)
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; done3. 重新启动并验证
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 秒。
经验总结
- 降配时慎降上限:如果未来可能再扩容,降配时可只降当前值(
setmem/setvcpus不加--maximum、setmaxmem不动),为在线扩容保留上限冗余。 - 热扩容三前提:Guest 内核支持 CPU/内存热插拔 + 上限有冗余 + 使用
--live(需持久化则加--config)。 - 报错即信号:
greater than max allowable vcpus/cannot set memory higher than max memory说明上限锁死,只能走「改上限 + 关机启动」流程。 - 关机启动 ≠ reboot:配置变更必须由 QEMU 进程重建加载,
virsh reboot不生效。