首页/云/云平台与虚拟化速查/virsh 在线调整 CPU 与内存
虚拟化操作94 条

virsh 在线调整 CPU 与内存

setvcpus 与 setmem 支持在线调整资源:CPU 热插拔依赖 guest ACPI 与定义时的上限预留,内存调整依赖 balloon 机制;二者都受 guest 内支持程度制约。

云平台与虚拟化速查云更新于 2026-10-13

在线调整资源是什么

virsh setvcpus 与 setmem 用于在虚机运行中调整 vCPU 与内存。CPU 热插拔要求 guest 内核与 ACPI 支持,而且定义里的 vcpu 上限要留出空间;内存调整走 balloon(气球)机制,调小是请 guest 归还内存,调大则受定义的最大内存限制。

基本信息

调整 vCPUvirsh setvcpus vm1 4 --live --config
内存气球virsh setmem vm1 2GiB --live(调小)
内存上限virsh setmaxmem(通常需关机)
查看气球virsh dommemstat vm1
前提条件guest 支持 CPU 热插拔与 ACPI;定义中的 vcpu 与最大内存要有余量
持久化加 --config 才会写入下次启动的定义

典型使用场景

  • 业务高峰临时增加 vCPU(guest 支持热插拔时)
  • 排查内存异常时用 balloon 临时收缩做对照实验
  • 虚机规格配错后先在线纠正,再同步修改模板
  • 验证 balloon 是否真的生效,看 guest 是否配合归还内存
  • 在测试环境临时压缩资源占用,缓解宿主内存压力

在线调整与核对

在线调整与核对
virsh dominfo vm1 | grep -E 'CPU|memory'      # 先看当前 vCPU 与内存上下限
sudo virsh setvcpus vm1 4 --live --config     # 在线加到 4 个 vCPU,并写回定义
sudo virsh setmem vm1 2GiB --live --config    # 用气球把内存调整到 2GiB
virsh dommemstat vm1                          # 看 available 判断 guest 是否真的归还
virsh dumpxml vm1 | grep -A2 '<memory'        # 核对 memory 与 currentMemory 是否一致
virsh setmaxmem vm1 4GiB                      # 提高最大内存(多数场景需先关机)

几个命令的差别

命令作用范围限制
setvcpus在线增减 vCPUguest 需支持热插拔,超出定义上限直接失败
setmem通过 balloon 调整内存上限受定义最大内存约束,取决于 guest 是否配合
setmaxmem调整定义的最大内存一般要求虚机关机
dommemstat查看气球相关统计未配 balloon 设备时没有有效数据
balloon 是协商机制:guest 压力大时可以拒绝归还内存,所以要看 dommemstat 里的 available 变化,而不是只看命令返回成功。若 guest 内根本没有 balloon 驱动,这类统计会一直为空。
加 vCPU 不必然更快:guest 内的调度与锁竞争可能让性能反而下降。调整前先看宿主与 guest 两层的实际负载,调整后用同一套基准测试对比。

易错点

  • setvcpus 报无法调整:guest 不支持 CPU 热插拔,或定义里没预留 vcpu 上限
  • 只调大内存上限不等于 guest 立即可见:需要在 guest 内确认生效方式
  • 命令加了 --live 却漏了 --config,重启后配置回到旧值
  • 用 balloon 长期收缩内存应对宿主压力,guest 换页开销上升,业务响应变慢
  • 在线改了资源却没同步虚机模板与台账,重建出来的实例规格与现状不一致
  • 在线扩容后未跑基准测试,guest 内调度与锁竞争可能让性能反而下降

数据来源与参考

  • libvirt 文档:virsh setvcpus / setmem
  • QEMU 文档:balloon 设备
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌