KVM虚拟机CPU内存热扩容,不用关机调整配置
KVM虚拟机支持在运行状态下调整CPU和内存,前提是宿主机和虚拟机配置允许。
本文面向零基础用户,用virsh命令完成CPU和内存热扩容,全程不用关机。
操作前建议先确认虚拟机XML中已启用热插拔支持,否则命令可能报错。
先检查宿主机和虚拟机的热插拔能力
登录宿主机,查看虚拟机名称和当前配置:
virsh list --all
virsh dominfo 虚拟机名称
virsh dumpxml 虚拟机名称 | grep -E "vcpu|memory|maxMemory|maxVcpu"
关键看两个值:和。
如果XML里没有这两项,热扩容会失败。
建议在关机状态下用virsh edit补上:
8388608
4
maxMemory是上限,current是当前生效值。
改完后重启虚拟机使配置生效。
在线增加CPU核心数
确认虚拟机当前CPU数:
virsh vcpucount 虚拟机名称 --live
热扩容到4核:
virsh setvcpus 虚拟机名称 4 --live --config
--live立即生效,--config写入持久配置。
执行后再次查看:
virsh vcpucount 虚拟机名称 --live
如果报错提示“maximum vcpus exceeded”,说明maxVcpu设小了,需要先关机调整上限。
在线调整内存大小
内存热扩容比CPU稍复杂,需要虚拟机内核支持内存热插拔。
先看当前内存:
virsh dominfo 虚拟机名称 | grep Memory
增加到4GB:
virsh setmem 虚拟机名称 4194304 --live --config
单位是KiB,4194304即4GB。
执行后验证:
virsh dominfo 虚拟机名称 | grep Memory
如果命令报错“invalid memory size”,检查maxMemory是否够大。
常见报错与避坑
- CPU热添加后系统识别不到:部分Linux发行版需手动触发CPU上线,在虚拟机内执行
echo 1 > /sys/devices/system/cpu/cpuN/online。 - 内存热添加无效:确认虚拟机XML中
的unit和实际值一致,且宿主机有足够空闲内存。 - 操作后重启丢失:务必加
--config参数,否则只对当前运行实例生效。 - Windows虚拟机:CPU热添加通常需要Windows Server版本支持,普通Windows 10可能无法在线识别。
验证扩容是否真正生效
在宿主机执行:
virsh dominfo 虚拟机名称
查看CPU和内存是否已更新。
再登录虚拟机内部,用lscpu和free -h确认操作系统识别到新资源。
如果虚拟机内没变化,优先检查maxVcpu和maxMemory设置,以及是否加了--live参数。
热扩容适合临时提升性能,但频繁调整建议直接改XML并重启,稳定性更好。
操作前备份XML:virsh dumpxml 虚拟机名称 > 虚拟机名称.xml.bak。
常见疑问
热扩容后虚拟机内CPU不识别怎么办?
先确认virsh vcpucount显示的数量已增加。
若宿主机已增加但虚拟机内lscpu没变,手动上线CPU:在虚拟机内执行echo 1 > /sys/devices/system/cpu/cpu3/online,把cpu3换成实际编号。
内存热扩容后free命令显示没变?
检查virsh dominfo里的内存值是否已更新。
如果宿主机已变而虚拟机内没变,可能是内核未启用内存热插拔,尝试echo online > /sys/devices/system/memory/memoryN/state。
热扩容会影响业务运行吗?
正常情况下不会中断业务,但CPU和内存热插拔属于内核特性,建议在业务低峰期操作,并提前备份虚拟机XML。