核心概述

实时迁移(Live Migration)是云基础设施的基石。KVM 体系主要通过 QEMU 实现,核心算法包括:

  • Pre-copy (迭代预拷贝):主流方案,通过脏页跟踪不断缩小状态差异。
  • Post-copy (后拷贝):利用 userfaultfd 处理迁移不收敛的特殊场景。
  • 底层支撑:依赖 Intel PML 硬件加速脏页记录,以及 Gratuitous ARP 实现网络无缝切换。

KVM 虚拟机实时迁移技术深度解析:实现原理与核心机制

实时迁移(Live Migration)是指将一个正在运行的虚拟机(Guest OS)从一台物理主机(Source Host)迁移到另一台物理主机(Destination Host),同时保证业务不中断,停机时间(Downtime)通常在毫秒级。


一、 核心算法:Iterative Pre-copy(迭代预拷贝)

这是 KVM 目前最主流、默认的迁移算法。其核心思想是:在虚拟机继续运行的同时,不断将内存数据传输到目标端。

1. 迁移过程详解

  1. 准备阶段:目标端启动一个空的 QEMU 进程,通过 -incoming 参数进入数据接收模式。
  2. 迭代传输阶段
    • 第一轮:将虚拟机的所有内存页(RAM)全部传输到目标端。由于传输需要时间,此时 Guest 仍在运行,并不断产生新的写操作(脏页)。
    • 后续轮次:仅传输上一轮产生的脏页(Dirty Pages)
    • 终止判定:当脏页产生的速度小于传输速度,或者脏页数量减少到一定阈值时,进入最后阶段。
  3. 停机拷贝阶段(Stop and Copy)
    • 暂停源端虚拟机,确保不再产生新数据。
    • 传输剩余的最后少量脏页。
    • 传输 vCPU 状态(通用寄存器、控制寄存器等)和设备状态(VirtIO 状态、中断控制器等)。
  4. 目标端恢复:目标端加载状态,恢复运行。

二、 脏页跟踪机制:底层如何实现?

要实现迭代传输,KVM 必须能够准确感知哪些内存被“写”过了。

1. 软件模拟(基于页表写保护)

在早期或不支持硬件特性的环境中:

  • KVM 会将 Guest 的所有二级页表项(EPT/NPT)标记为“只读”。
  • 当 Guest 试图写内存时,触发分页异常,导致 VM-Exit
  • KVM 在**脏页位图(Dirty Bitmap)**中标记该页,并将其设为可写。
  • QEMU 通过 ioctl 周期性地获取该位图并清理,从而识别需要重传的页。
  • 痛点:每次写操作都要 VM-Exit,性能损耗极大。

2. 硬件辅助:Intel PML (Page Modification Logging)

现代 CPU 提供了硬件级支持。

  • 原理:在 VMCS 中配置一个 PML 地址。当 Guest 写内存时,硬件 MMU 直接将页索引写入该日志缓冲区。
  • 优点:写操作几乎没有额外开销,极大提升了写密集型业务在迁移时的稳定性。

三、 迁移不收敛的终极武器:Post-copy

如果 Guest 的写速度持续超过带宽(如高负载 Redis),Pre-copy 会陷入死循环。此时需要 Post-copy(后拷贝) 技术。

1. 核心流程

  1. 快速切换:在 Pre-copy 进行一轮传输后,强行停止源端虚拟机。
  2. 状态先行:仅传输 vCPU 状态和关键设备状态。
  3. 目标端抢先启动:目标端虚拟机立刻开始运行。
  4. 按需索取(On-demand Paging)
    • 利用 userfaultfd 拦截缺页中断。
    • 当虚拟机访问未到位内存页时,目标端向源端发出请求,源端通过网络实时发回该页。
  5. 后台推送:源端在空闲时持续把剩余内存推送到目标端,直到同步完成。

四、 外部资源:网络与存储的无缝衔接

  1. 存储(Storage)

    • 共享存储:迁移时仅切换磁盘文件锁(Locking)。

    • 无共享存储(Shared-Nothing / Block Migration): 这是最复杂的情况,通常通过 Drive MirroringNBD (Network Block Device) 协议实现。

      四阶段实现流程:

      1. 全量块拷贝 (Bulk Copy):源端 QEMU 读取本地磁盘所有扇区并发送至目标端,同时维护一个磁盘脏块位图。
      2. 脏块迭代 (Iterative Sync):全量拷贝期间产生的写操作被记录为脏块,随后进行多轮迭代传输。
      3. 主动镜像 (Active Mirroring):当差异极小时,QEMU 进入同步模式。Guest 的每一次写 I/O 会同时发送到本地和目标端。
      4. 切断与转向 (Pivot):内存同步完成后,停止源端 I/O,目标端 QEMU 接管本地磁盘文件。

      Shared-Nothing 迁移架构图:

            源端主机 (Source)                         目标端主机 (Dest)
          +-------------------+                     +-------------------+
          |   虚拟机 (Guest)   |                     |                   |
          +---------|---------+                     |                   |
                    V                               |                   |
          +---------|---------+                     |                   |
          | QEMU Block Layer  |                     |                   |
          |  (Mirror Driver)  |                     |                   |
          +----/----------\---+                     +---------^---------+
              /            \                        |  NBD Server       |
             /              \----------(网络)------->|  (写入目标磁盘)     |
            V                                       +---------|---------+
      [ 本地磁盘镜像 ]                                 [ 目标磁盘镜像 ]

      代价分析:准备时间极长(1TB 磁盘在万兆网下需 ~20 分钟),且由于“主动镜像”阶段的同步写特性,Guest 的磁盘写延迟会显著增加。

  2. 网络(Network)

    • 目标端运行后发送 免费 ARP (Gratuitous ARP)
    • 强制更新物理交换机的 MAC 地址表,将流量导入新端口。

五、 技术对比总结

特性Pre-copy (主流模式)Post-copy (应急模式)
数据安全性极高(失败后源端可无损恢复)中(网络中断会导致 Guest 崩溃)
迁移成功率依赖带宽与写速率的博弈100% 成功(强制收敛)
停机时间毫秒级(但不可预测)极短且恒定(微秒级切换)
核心技术Dirty Logging / PMLuserfaultfd / Page Fault
典型场景大多数通用云服务器内存巨大且写极其频繁的数据库