KVM 热迁移

张开发
2026/4/20 15:32:21 15 分钟阅读

分享文章

KVM 热迁移
KVM 热迁移是在虚拟机持续运行、业务几乎无感知的前提下将其从源宿主机完整迁移到目标宿主机的技术核心是内存状态 设备状态 CPU 状态的在线同步仅最后阶段短暂停机毫秒级。KVM 热迁移的本质就是在虚拟机持续运行时通过迭代同步内存脏页在极短停机时间内完成虚拟机全部运行状态的网络传输与远程恢复实现宿主机之间无缝切换。迁移 “运行时状态”不是迁移 “文件”虚拟机 两部分静态镜像硬盘文件动态状态内存 CPU 寄存器 设备状态普通迁移 关机 → 拷贝文件 → 开机热迁移 不关机只迁移动态状态所以本质是只迁移 “此刻正在运行的状态”磁盘数据不动或后台同步。必备前提条件源宿主机 目标宿主机同 CPU 架构x86_64指令集尽量一致可通过 libvirt CPU 模式如matchexact、custom兼容差异。KVM、QEMU、libvirt 版本尽量一致网络互通最好万兆迁移专用网虚拟机磁盘放在共享存储NFS/iSCSI/ceph两台主机都能访问同一路径禁用本地磁盘缓存cachenone。磁盘cachenone或cachewritethrough虚拟机不能有PCI 设备直通GPU、网卡直通等本地挂载的物理磁盘防火墙放行SSH 22 端口libvirt 迁移端口16509 等源 / 目标网络互通专用高速迁移网络万兆优先开放端口 16509QEMU 默认、SSH 端口防火墙放行。软件源 / 目标 KVM、QEMU、libvirt 版本一致虚拟机配置vCPU、内存、网卡、磁盘完全一致无 PCIe 直通除 KAE 等特殊设备。核心原理1. 迁移类型共享存储热迁移主流虚拟机磁盘存于 NFS/iSCSI/FC/GlusterFS 等共享存储源 / 目标均可访问仅迁移内存与状态速度最快。非共享存储热迁移本地磁盘随虚拟机一起在线拷贝迁移速度慢、带宽占用大。2. 核心流程共享存储预拷贝阶段源 VM 持续运行QEMU/KVM 将全部内存页发送到目标同时记录被修改的 “脏页”循环同步脏页直到脏页量足够小。停机同步阶段短暂暂停源 VM传输最后一批脏页与设备 / CPU 状态目标完成状态加载。恢复运行目标 VM 启动源 VM 销毁业务恢复。3. 关键机制脏页跟踪KVM 通过页表标记修改页减少重复传输。自动收敛Auto-Converge脏页生成过快时适度限流 VM CPU确保迁移能完成。最大停机时间Max Downtime控制最后停机时长默认 300ms可设。带宽限速避免迁移占用过多业务带宽。压缩zlib/zstd、多通道MultiFD加速传输、降低带宽。脏页迭代预拷贝Dirty Page Pre-copy在虚拟机持续运行时通过多轮迭代只同步被修改过的内存页脏页不断缩小需要传输的数据量直到脏页足够少再短暂停机完成最终同步实现几乎无感知迁移。脏页迭代预拷贝原理 硬件跟踪脏页 运行时多轮只传变化页 最后毫秒级停机同步最小状态实现虚拟机内存从一台物理机无缝搬到另一台。这是 KVM/QEMU 热迁移真正的核心原理。第一轮全量内存拷贝源主机把 VM 全部内存发给目标主机。VM 还在跑业务不中断。第二轮只拷贝 “脏页”KVM 会标记哪些内存页被修改过 → 只发这些脏页。循环反复脏页越来越少。最后一刻停机毫秒级同步最终状态脏页足够少 → 暂停 VM 极短时间发送最后一点脏页 CPU 寄存器 设备状态目标机恢复执行目标机从收到的状态继续跑IP 不变、连接不断。本质利用 “脏页收敛” 实现近乎无感知切换。完整流程原理1. 开启脏页跟踪Dirty Logging源宿主机的 KVM 内核模块会给虚拟机的所有内存页打上可跟踪标记一旦 VM 往某页内存写数据该页立刻被标记为脏页Dirty Page这是整个技术的基础知道哪些页变了。2. 第一轮全量内存预拷贝源 QEMU 把虚拟机全部内存页发给目标主机虚拟机全程不暂停业务正常跑同时KVM 持续记录新产生的脏页结果目标机拿到了一份 “旧但完整” 的内存镜像。3. 多轮迭代只同步脏页核心这就是 “迭代” 的含义循环执行把本轮所有脏页发送到目标机清空本轮脏页标记继续跟踪新产生的脏页特点每一轮只传变化的少量数据正常业务下脏页会越来越少逐步收敛VM 始终不停止4. 停机同步Stop-and-Copy当脏页已经非常少达到阈值短暂暂停虚拟机毫秒级发送最后一批脏页发送 CPU 寄存器、设备状态目标机加载完整状态启动运行源机销毁虚拟机切换完成。关键机制原理1. 脏页跟踪怎么实现底层依赖Intel EPT / AMD NPT硬件辅助虚拟化页表KVM 将页表权限设为只读一旦 VM 写入触发EPT 违反异常KVM 捕获后标记该页为脏页恢复可写权限这是硬件级高效跟踪几乎无性能损耗。2. 为什么要 “迭代”因为 VM 一边迁移一边改内存。只传一轮会导致目标机内存永远落后。多轮迭代 → 脏页递减 → 最终可收敛。3. 为什么停机时间极短因为停机时只传最后一小批脏页寄存器 设备状态KB 级所以停机通常 300msTCP 不断、业务无感。用最简单的比喻理解你要抄写一本正在被不断修改的书先抄完整本第一轮全量作者边写你边改只改被涂改的页面迭代传脏页等作者修改越来越少让作者停笔 0.1 秒你抄完最后几页你手里的书和原书完全一致这就是脏页迭代预拷贝。核心优势1.业务几乎无感知停机时间极短绝大多数内存是在VM 正常运行时后台同步的只在最后脏页极少时才短暂暂停 VM停机时间通常几十毫秒几百毫秒应用、TCP 连接基本不会断这是它能实现真正热迁移的根本原因。2.避免一次性全量停机拷贝如果不做迭代而是一次性停 VM、传全部内存内存越大停机越久32G 内存可能要停几秒甚至更久业务直接雪崩迭代预拷贝把停机时间从 “秒级” 压到 “毫秒级”。3.网络压力更平滑不会瞬间打满带宽不是一次性爆发传输多轮迭代、渐进式同步对物理网络冲击小不会影响同宿主机其他 VM4.自动适应业务压力能 “追得上” 脏页VM 一边跑、一边改内存会不断产生脏页。预拷贝会第一轮传全部内存之后只传变化的脏页每一轮脏页通常越来越少最终能收敛完成这保证了迁移一定能结束而不是永远追不上。5.内存越大优势越明显8G、16G、64G、128G 内存的 VM 都能平滑迁移不需要为迁移预留额外巨大内存缓冲对宿主机资源占用可控6.成熟稳定兼容性极强从老版本 KVM 到最新版本都支持不需要特殊硬件不依赖存储架构共享 / 非共享都能用是工业界标准热迁移方案。架构本质QEMU 状态序列化 网络传输KVM 热迁移不是硬件级迁移而是QEMU 把虚拟机状态序列化通过网络传给另一个 QEMU。源 QEMU导出状态网络传输状态数据目标 QEMU导入状态、恢复执行本质两个 QEMU 进程之间的状态转移。为什么能做到 “热”因为虚拟机的执行环境是完全虚拟化的所有状态都在内存和 QEMU 控制下没有绑定物理 CPU / 物理硬件内存可以被追踪、复制、传输本质虚拟化层把硬件抽象掉了状态可迁移。最简单的热迁移命令virsh1. 基础共享存储热迁移virsh migrate --live 虚拟机名 qemussh://目标IP/system示例virsh migrate --live vm101 qemussh://192.168.1.100/system2. 更稳定的参数推荐virsh migrate --live \ --auto-converge \ # 自动收敛防止脏页追不上 --unsafe \ # 忽略部分兼容性检查 --migrateuri tcp://目标IP \ 虚拟机名 qemussh://目标IP/system3. 限制带宽virsh migrate-setspeed 虚拟机名 --bandwidth 500单位Mbps4. 设置最大停机时间业务无感virsh migrate-setmaxdowntime 虚拟机名 300单位毫秒5. 查看迁移状态virsh domjobinfo 虚拟机名看到Job type: Unbounded正在迁移Job completed successfully成功常见失败原因CPU 型号 / 指令集不一致解决虚拟机 XML 里加cpu modecustom matchexact checknone model fallbackallowSkylake-Client-noTSX-IBRS/model /cpu脏页产生太快迁移无法收敛解决加--auto-converge会自动轻微压制虚拟机 CPU网络不通、防火墙拦截关闭防火墙或放行业务与迁移端口磁盘路径不一致、权限不对两台主机挂载共享存储路径必须完全一样

更多文章