虚拟机热升级不中断服务的关键技术,本质上是在内存快照、CPU状态同步、存储切换与网络连接保持四个维度上的协同操作,其中以内存预拷贝和设备热插拔为核心。
虚拟机热升级是什么?先看清它与冷升级、迁移的区别
虚拟机热升级指的是在虚拟机持续运行、业务进程不停止的情况下,完成CPU、内存、磁盘或虚拟硬件版本的更新,很多人容易把热升级和在线迁移混为一谈,事实上两者目标不同:迁移是把虚拟机从一台物理机搬到另一台,而热升级是在同一台物理机(或同一集群)内对虚拟机自身配置和虚拟化层组件做变更。
虚拟机热升级与迁移的核心区别
| 维度 | 热升级 | 在线迁移 |
|---|---|---|
| 目标 | 更新虚拟机配置或宿主机内核 | 更换物理宿主机 |
| 网络地址 | 通常保持不变 | 可能需要保持或漂移 |
| 存储路径 | 不移动磁盘文件 | 可能涉及存储迁移 |
| 中断窗口 | 毫秒级或零感知 | 秒级或更长 |
行业共识认为,热升级的真正难点不在“能改配置”,而在“改配置的过程中,虚拟机里的应用完全无感”,比如数据库连接不断、TCP长连接不重置、内存中的业务状态不丢失。
核心关键技术一:内存预拷贝与停机窗口压缩
虚拟机热升级最怕的是停机时间,当需要调整CPU或内存规格时,虚拟化平台必须先让虚拟机进入一个暂停状态,将CPU寄存器、内存页、设备状态同步到新的配置中,这里的关键技术是内存预拷贝(Pre-Copy)。
预拷贝如何做到不中断服务
预拷贝的思路是:在虚拟机正式暂停之前,先把绝大部分内存数据从旧实例拷贝到新实例,期间虚拟机照常运行,只有最后剩余的变化页(脏页)需要短暂冻结复制,具体流程如下:
- 第一步:虚拟化层在后台创建新配置的虚拟机骨架,不启动业务。
- 第二步:持续迭代拷贝内存页,每次拷贝后记录哪些页面被应用改写过。
- 第三步:当脏页数量降到阈值以下,暂停业务,拷贝剩余脏页和CPU状态。
- 第四步:切换到新实例,恢复网络和存储,整个过程通常控制在几十到几百毫秒。
业内专家指出,预拷贝效率决定了停机窗口长短,如果应用是内存密集型的,脏页产生速度大于拷贝速度,平台就会自动切换为后拷贝(Post-Copy)模式,先转移CPU状态再按需拉取内存页,后拷贝的优点是停机时间极短,但第一次访问缺页会有轻微延迟。
实操中如何观察停机窗口
在KVM虚拟化场景下,使用virsh命令控制热升级时,virsh migrate --live是典型做法,若希望看到实时转移状态,可开启:
virsh migrate --live --verbose --timeout 30 --timeout-suspend vm-name qemu+ssh://destination/system
输出中的“Iteration”次数和“dirty pages”数值能直观反映预拷贝进度,若迭代次数突然飙升,说明应用写内存频率过高,需要评估业务峰值期再操作。
核心关键技术二:设备热插拔与驱动层面兼容
修改CPU和内存规格,很多平台支持直接设备热插拔(Hotplug),不需要冻结虚拟机,这项技术依赖的是虚拟化层与客户机操作系统的ACPI热插拔协议。
CPU和内存热插拔的流程差异
CPU热插拔相对简单,虚拟化层将新vCPU作为一颗物理CPU插入,客户机系统收到ACPI通知后,内核自动启用新核心,内存热插拔则需要额外步骤:
- 向客户机发送内存热插拔事件
- 客户机操作系统将新内存块加入内存管理子系统
- 应用层无感知,但部分老版本Linux内核需要预先开启
CONFIG_MEMORY_HOTPLUG支持
实际操作中,如果使用libvirt管理,热插拔内存命令如下:
virsh setmem vm-name --size 8G --live virsh setvcpus vm-name --count 8 --live
驱动层最常见的坑:PCIe设备透传
若虚拟机内使用了SR-IOV网卡或GPU透传,热升级时这些设备无法直接热拔插,虚拟化平台必须调用PCIe热插拔控制器做整体复位,这会导致设备驱动重置,进而触发业务中断,解决思路有两个:
- 使用支持
VFIO的设备热重置机制,让驱动在设备恢复后重新初始化 - 将透传设备改为virtio虚拟网卡,牺牲部分性能换取热升级成功率
多数情况下,生产环境会选择后者,因为热升级不中断服务要求的是业务连续性,而不是单网卡极限性能。
存储切换与网络保持:热升级中容易忽略的细节
很多人关注内存和CPU,却忽略了存储和网络,虚拟机热升级如果涉及磁盘控制器型号变更或存储后端调整,必须保证I/O路径不中断。
存储层技术:块设备复制与元数据锁定
在QEMU/KVM环境中,使用blockdev实时镜像拷贝,可以将旧镜像设为只读,新镜像接收新写入,之后逐步同步未完成的备份块,这个操作对客户机完全透明。
需要特别留意的是:复制期间不能关闭虚拟机快照链,若快照文件损坏,热升级会直接失败,建议操作前执行:
virsh blockcommit vm-name vda --wait --verbose
确保当前活动层合并到基础镜像后再做存储切换。
网络保持:TCP连接不重置的秘密
网络通信不中断,依赖虚拟机MAC地址和IP地址在升级前后保持不变,虚拟化层的做法是保留虚拟网卡的PCI槽位号,仅升级后端驱动或带宽参数,这样客户机的ARP表项和TCP会话状态都不会失效。
若必须更换虚拟网卡模型,则需要借助virtio-net的多队列热更新能力,新驱动会先以备用通道建立,再在几十毫秒内切换流量。
热升级失败怎么办?回滚与降级路径
再完美的技术也有失败概率,热升级失败关键看能否恢复到原状态,行业共识是,升级前必须做全量内存和磁盘快照,否则失败后虚拟机可能处于混合状态。
常见失败场景和应对
- 内存预拷贝超时:退回首轮拷贝,缩短脏页追踪周期,重新发起升级
- 客户机操作系统不响应ACPI热插拔事件:强制重启客户机内核模块,但不建议盲目强制
- 存储切换后出现I/O错误:立即把存储指向原镜像备份点,暂停写入,防止数据二次污染
具体恢复命令在KVM平台可参考:
virsh revert vm-name snapshot-name virsh restore vm.xml
恢复操作本身也会产生短暂中断,所以热升级方案要设计成“升级失败自动回滚”,而不是等人工介入后慢慢处理,这属于运维层面的事前规划。
Q&A:虚拟机热升级常见问题点
虚拟机热升级需要多长时间?
热升级时长由内存大小、脏页速率和存储速度共同决定,一个8GB内存、中等写入量的虚拟机,预拷贝阶段通常在几十秒到两三分钟,最终停机窗口控制在毫秒级,极端情况下,如果应用以每秒几百MB的速度改写内存,耗时会延长到十分钟以上,此时建议错峰操作。
虚拟机热升级失败会影响正在运行的业务吗?
失败影响取决于失败点位置,若失败发生在内存预拷贝阶段,业务无感知,只是升级动作终止,若失败出现在最后交换状态的几十毫秒窗口,虚拟机可能进入暂停或重启,导致短暂连接中断,因此可靠平台都会在交换机前保留原始实例的完整状态,确保回滚不出意外。
虚拟机热升级和热迁移哪个更适合生产数据库?
生产数据库对网络和存储抖动敏感,热迁移会更换宿主机导致网络路径变化,热升级保持物理位置和网络路径不变,更适合数据库这类长连接型业务,但需要特别注意内存预拷贝时脏页追踪带来的轻微性能损耗,建议在业务低峰期执行。
虚拟机热升级不是某一种孤立技术,而是内存、设备、存储、网络四层协作的产物,预拷贝负责解决内存转移,热插拔解决资源变更,快照与回滚解决不确定性,理解了这几条主线,再结合你的虚拟化平台去验证细节,才能做到真正的业务无感升级。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/621685.html





