微思网络资深工程师林涛原创技术文章,转载需授权

VMware vMotion是当今vSphere虚拟化架构中最重要的功能之一。它能够将活动状态的虚拟机从一台物理ESXi主机在线迁移到另一台ESXi主机上。
如下图所示,vMotion自2003年发布起至今,新增多种技术支持vMotion功能。

此文简单说明虚拟机迁移时后台处理的过程,能够更好的了解vMotion功能。
vMotion初始化
vCenter Server启动虚拟机迁移任务后,将执行一个叫"long-running迁移任务"以处理迁移。第一步进行一个兼容性检查,并创建一个migration specification,包括以下信息:
要迁移的虚拟机该虚拟机的配置(虚拟硬件,选项等)源ESXi主机目标ESXi主机vMotion网络详细信息接着vCenter Server用Virtual Provisioning X Daemon (VPXD)与ESXi主机通信,该VPXD调用ESXi主机上运行的Virtual Provisioning X Agent (VPXA) 。VPXA侦听VPXD并接收migration specification信息,最后通过Host Daemon(hostd)传递给Virtual Machine Extension (VMX)。

Virtual Machine Monitor (VMM)负责管理虚拟机内存,把虚拟机存储和网络I/O请求转发给VMkernel。其他对性能、I/O请求影响不大的都由VMM转发给VMX。
完成以上步骤后,源ESXi主机上的VMkernel迁移模块打开vMotion网络通道与目标ESXi主机建立连接。
准备阶段--预复制阶段
到目前为止,所有前期准备工作都已经就绪。此外,目标ESXi主机通过migration specification创建好虚拟机。接下来进入预复制阶段,内存页面将从源ESXi主机传输至目标ESXi主机。
在vMotion过程中,为了判断哪些内存页面是覆盖重写的(dirty pages),这时候就需要对ESXi主机上的所有内存页面进行跟踪,再把这些dirty pages重新发给目标ESXi主机。
Page Tracing
在预复制阶段,虚拟机会短暂暂停(毫秒)所有的vCPU安装page tracers。安装完成后VMM就会启用内存页面跟踪及记录dirty pages,之后VMM通知VMkernel迁移模块把标记的dirty pages复制到目标ESXi上。

Iterative Memory Pre-Copy
内存预复制是一个连续重复的任务,以迁移一台24GB内存虚拟机为例:
阶段-1:复制24GB内存,在此期间写入8GB dirty pages.
阶段0:复制8GB内存,在此期间写入3GB dirty pages.
阶段1:复制3GB内存,在此期间写入1GB dirty pages.
阶段2:复制剩余的1GB内存
当然每个预复制任务都会对源主机和目标主机的内存页面进行对比,确保每个内存页面都被同步。

通过传输速度/内存页面变化速度/剩余内存页面数计算出下一次预复制完成窗口<500ms,即可停止预复制任务,如果>500ms则继续循环预复制任务。
当内存页面变化速度>传输速度时,vSphere 5.0后引入了Stun During Page Send (SDPS)机制,SDPS就是每次预复制任务时VMkernel让VMM短时间内暂停(微秒),减小内存页面的变化,最终缩短下一次预复制的时间<500ms。
切换
当所有的内存页面都迁移到目标ESXi主机上时,VMM将会终止内存页面预复制任务。VMM通过remote procedure call (RPC)告知VMX可以挂起源虚拟机。VMX挂起源虚拟机并把checkpoint数据发送给目标ESXi主机,目标VMX进程根据checkpoint数据将目标虚拟机恢复起来。

恢复虚拟机时跳过启动过程,直接指向内存页面,这个过程通常在100-200ms之间。
虚拟机此时已经完成实时迁移。
举报/反馈