虚拟化与云计算技术硬核内幕 (25) —— 空乘小姐姐和乾坤大挪移 (下)

2022-09-08 17:09:22 浏览数 (1)

上回说到,空乘小姐姐吹了一口气,飞机就飞向了蓝天。

但这实际上是不可能的,只存在于宅男们的幻想之中。

同样,虚拟机的迁移,也不能把CPU的寄存器内部内容搬运到新的宿主机上就可以了。如果仅限于搬运CPU寄存器内容,那么,当目的宿主机上的CPU,从原宿主机上CPU指令指针 (RIP寄存器)指向的地址开始执行指令的时候,执行的是不可预测的内容,后果是可想而知的。

如图所示,在Host A上,RIP指针指向的指令内容为0x00ff0b01,其汇编指令为

代码语言:javascript复制
add bh, bh

而Host B的RAM内容与Host A是不同的,在这个地址的内容为0x00000000,其汇编指令为

代码语言:javascript复制
add [rax], al

显然,这并没有完成虚拟机从Host A到Host B的迁移。

因此,我们需要把内存从Host A复制到Host B。

小E想通了这点,兴高采烈地去做实验,可是,她发现,虚拟机迁移的速度实在太慢了,经常需要几秒钟,甚至更长的时间。而在VMWare环境下,虚拟机迁移却可以在秒级别的时间内完成。

原来,将虚拟机的内存搬运到另一台宿主机,需要通过宿主机之间的网络。如果虚拟机有16GB内存,通过双口25Gbps的以太网搬运,需要的理论时间为

16GB*8/(25Gbps *2) = 128/50 = 2.56秒

加上网络传输本身的开销,虚拟机迁移中,通过网络搬运内存的时间只会更多。

如果将宿主机A上的虚拟机暂停,将虚拟机的内存完全搬运到宿主机B,在宿主机B上再启动该虚拟机,虚拟机从暂停到恢复执行所需要的时间,就完全取决于内存搬运的时间,如下图所示:

虽然使用RDMA一类的技术可以在一定程度上加速内存的搬运,但是无论如何,内存搬运的时间也无法超越网络传输的理论值。

那么,能不能改变以下次序,先把内存搬运到目的宿主机,再停止源宿主机上的虚拟机,最后启动目的宿主机上的虚拟机呢?

看起来似乎很美,虚拟机的停机时间理论上可以无限趋近于0。

但是,我们发现,由于内存搬运的时间为秒级,在这段时间里面,源宿主机上的VM在运行中,有可能改写内存的内容,而目的宿主机上对应地址的内存内容如果尚未更新,这并不是我们需要的。

那么,有没有办法让虚拟机内存搬运期间,被改写的内存(可称为“脏”内存)能够被记录下来,并复制到目的宿主机呢?

小E又一次搬出了厚厚的《Intel 64 and IA32 Architectures Software Developers Manual》。

原来,Intel的处理器中,可以通过对内存页表的一种特殊操作实现这种脏内存标记和复制的功能。

我们在《虚拟化与云计算硬核技术内幕 (7) —— 花名与破冰》中提到过,在保护模式下,逻辑内存地址(或称为线性地址),和物理内存地址之间是通过页表进行映射的,每个页的属性在描述符中确定。

那么,如果我们将一个页设为write protected,对这个内存页(逻辑地址)的写入行为会触发处理器的异常。在操作系统提供的处理器异常处理例程中,我们就可以处理对于脏内存的标记了。

如图,在虚拟机运行时,宿主机上的LA(Linear Address)在TLB中映射到PA(Physical Address)。

当LA所在的内存页被搬运到目的宿主机后,LA所在的内存页会被设为只读。在这个时间点以后,对LA地址的写操作,会触发CPU异常。操作系统提供的异常处理例程中,会把这个内存页改为可读写,并在脏内存表中记录下这个内存页的开始地址和长度。在虚拟机所有的内存页搬运完毕后,操作系统暂停虚拟机的运行,搬运脏内存表中涉及的内存页,以及寄存器(Register File)状态到目的宿主机上,目的宿主机上的操作系统再启动该虚拟机,如下图所示:

由于在虚拟机运行内存拷贝期间,被改写过的内存量(脏内存页)不会很大,因此,虚拟机停机的时间也可以很短,一般可以控制在100ms以内。

这样,我们就可以解决运行时状态搬运的问题了。

最后的一个问题,是持久化存储的搬运。

虚拟机中,持久化存储盘里面会有操作系统运行所需的全部文件,虚拟机上应用所需的可执行文件以及其他数据文件,一般可达几百GB到TB级别。

这些数据,如果需要通过网络完整地搬运去目的宿主机,时间可达分钟级别。我们有没有好的办法实现持久化存储盘的“乾坤大挪移”呢?

小E想了想,在方老师的公众号里面翻到了关于云存储的专题,顿时开悟了:

如果利用分布式存储提过的云存储卷作为虚拟机的系统盘和数据盘,虚拟机迁移到目的宿主机后,宿主机的Hypervisor重新为虚拟机挂载原有的系统盘和数据盘,再恢复虚拟机的运行,虚拟机就可以完全感知不到迁移的存在,继续使用原有的存储卷运行应用了!

小E弄懂了虚拟机迁移的问题,非常开心。这时候,T姐来了,叫上小E:“下星期一,咱们一块去趟SZ市吧!”

小E一听可以出门去,更高兴了,蹦蹦跳跳地回到了座位。

想知道小E出差路上发生了什么有意思的事情,请看下回分解……

0 人点赞