虚拟机热迁移内存拷贝加速

彩虹网

背景

司内虚拟机热迁移成功率不高,通过归纳总结,主要原因是因脏页写速度比拷贝速度还快,导致内存拷贝无法结束,最终迁移失败。

为了解决这个热迁失败的主要问题,我们针对虚拟机内存拷贝加速做了一些优化,本文主要介绍内存拷贝原理和相关参数调优。

方案内存迁移基本原理

虚拟机热迁移内存拷贝目标是在最小化停机时间的前提下,将源主机上虚拟机(VM)的整个内存状态传输到目标主机。其基本原理可以概括为“预拷贝(Pre-copy)”+ 多次迭代和脏页跟踪。

虚拟机热迁移内存拷贝加速

初始全量拷贝:迁移开始时,QEMU先将虚拟机所有的物理内存页面的完整副本通过网络传输到目标主机,此时虚拟机仍在源主机上正常运行,应用程序和操作系统可以继续读写内存。迭代拷贝与脏页跟踪:在初始拷贝进行的同时以及之后,源主机上的 KVM 会持续跟踪虚拟机哪些内存页面被修改了(脏页),初始全量拷贝完成后,迁移进入迭代阶段:传输脏页: KVM 会检查脏页位图,将在上一次迭代周期内变脏的页面(即上次传输后又被修改的页面)再次传输到目标主机重置位图: 传输完这一批脏页后,脏页位图会被清除。重复: 虚拟机继续运行,产生新的脏页。KVM 再次检查新的脏页位图,传输新产生的脏页。这个过程不断重复。停机阶段:当迭代阶段结束,认为剩余的脏页量足够小(几十到几百MB级别)时,迁移进入停机阶段。这是服务唯一会短暂中断的时刻。源主机:暂停虚拟机的运行。将虚拟机 CPU 寄存器、设备状态、以及最后一次迭代后产生的所有剩余脏页传输到目标主机。这一步通常非常快,因为传输的数据量很小。目标主机:接收并应用最后的 CPU 状态、设备状态和剩余内存页。用这些状态恢复虚拟机运行。

恢复运行:

优化的目标

目标是让脏页产生的速度低于网络传输这些脏页的速度,使内存迁移能快速完成。

优化一:xbzrle压缩

参数作用:

核心作用是在 KVM 热迁移的预拷贝迭代阶段,高效压缩需要传输的脏页数据,从而显著减少网络传输量,最终达到降低总迁移时间和减小对网络带宽压力的目的。

加速效果:

加速效果受到 cache 大小的影响,适用于主机内存资源充足,且虚拟机内存频繁读写的场景。

命令行设置方式:

virsh qemu-monitor-command  --hmp 'migrate_set_capability xbzrle on'
virsh qemu-monitor-command  --hmp 'migrate_set_parameter xbzrle-cache-size 1024m

推荐参数设置:

xbzrle-cache-size 推荐设为 VM 内存的 1% 左右

优化二:compress内存压缩

虚拟机热迁移内存拷贝加速

参数作用:

压缩内存数据后进行拷贝,可以控制内存数据的压缩强度,平衡压缩速度与压缩比率,从而提升内存迁移的整体性能。

加速效果:

加速效果受到压缩率、CPU 压缩计算能力影响,加速效果不稳定。

命令行设置方式:

# 1-9级,级别越高压缩算法强度越强,默认 1
virsh qemu-monitor-command a9bcfbf2-5aae-4418-a4ba-b6c66755f07c --hmp 'migrate_set_parameter compress-level 6'
# 压缩使用的cpu 核数,默认为 1,通常设置为 CPU 核心数的 1/4 到 1/2
virsh qemu-monitor-command a9bcfbf2-5aae-4418-a4ba-b6c66755f07c --hmp 'migrate_set_parameter compress-threads 24'
# 解压缩使用的cpu 核数,默认为 1,与压缩核数设置一样即可
virsh qemu-monitor-command a9bcfbf2-5aae-4418-a4ba-b6c66755f07c --hmp 'migrate_set_parameter decompress-threads 24'

参数推荐:

压缩级别:compress-level=9

物理机压缩线程数:compress-threads=物理机 cpu*0.5

物理机解压缩线程数:decompress-threads= 物理机 cpu*0.5

优化三:cpu-throttle压制

参数作用:

限制虚拟机的CPU运行时间,通过强制引入休眠周期来减缓虚拟机内存脏页的生成速度,从而解决因脏页生成过快导致热迁移无法收敛的问题,因该参数影响虚拟机 cpu 运行,用户有感,推荐谨慎打开。

加速效果:

对虚拟机 cpu 进行压制的方式减少脏页产生速率,当 cpu 压制百分比设置较高的情况下加速效果明显,但是会影响虚拟机性能,用户有感。

命令行设置方式:

virsh qemu-monitor-command myvm --hmp 'migrate_set_capability auto-converge on'
virsh qemu-monitor-command myvm --hmp 'migrate_set_parameter cpu-throttle-initial 30'
virsh qemu-monitor-command myvm --hmp 'migrate_set_parameter cpu-throttle-increment 5'

参数推荐:

推荐当其他优化参数设置后,虚拟机内存迁移还是完成不了的情况下,打开该参数。

程序里 cpu-throttle-initial(初始值) 和

throttle-trigger-threshold(最大值)可以设置初始值为 1,当迁移时间超过 vm 内存*10 秒时,将该参数设置为60(即 60%cpu 压制),此时会对业务产生影响。

总结

通过将上面三个优化参数加入到程序中,优化效果:脏页生成 400MB/s 的 vm 由之前的“无法完成”优化到了 90s 迁移完成,800MB/s 的优化后 180s 迁移完成。

展望

内存加速方面,多线程拷贝multifd 也是一个可用优化参数,当前我们司内用的 qmue 版本对这个参数支持不太好,后期还需要调整。

另外就是内存加速的问题解决后,后续还会存在其他问题,例如 cpu 指令集不匹配等问题,后续还需持续治理。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。