Introduction
这篇是以MichaelR. Hines等人在2009年所写的Post-Copy Based Live VirtualMachine Migration Using Adaptive Pre-Paging and Dynamic Self-Ballooning来讨论。
Live Migration的技术在[1]的时候就几乎已经完备了,而现在有人提出post-copy的方法来与pre-copy的方法做比较,两种方法有好有坏,分别适用于不同的情境之下。
Pre-copy的技术是为了能够尽量地减少downtime,并且不影响服务的运作,而post-copy的技术则是为了减少total migration time且让程序能够持续的执行。
Design
Post-copy是由一小段stop-and-copy phase和pull-phase相结合的(相较于pre-copy的push-phase和stop-and-copy-phase),以下是post-copy执行的四个步骤:
( 1 ) Stopthe VM on source host
( 2 ) Copyprocessor state to the destination host
( 3 ) Resumethe VM on destination host
( 4 ) Beginfetching memory pages over the network from the source
其中,( 4 )很明显的是整个算法中的bottleneck,而此篇论文主要的目的也是在于如何改善第四个步骤,作者们提出了四个方法:
(1 )Demand paging
也就是一般pull phase的步骤,当在destination的VM执行时遇到page fault,就向sourcehost发出需求,此时source host会传回造成错误的page。属于被动的传输,除了有长时间的residual dependency外,每一次的page fault都会造成VM 的performance降低。唯一的好处是能够确保每一个page都只被传一次。
(2 )Active Push
为了改善( 1 )所带来的问题,除了造成page fault的页面必须先传输外,source host会从第一页page开始,不停的传送pages到destination端。变成主动的传输,能够有效的改善residual dependency的问题。
(3 )Pre-paging
改善( 2 )的方法,由于要预测page fault产生的情形相当困难,所以作者们利用读取memory常常读取一大块block的特性,由造成fault的那页page邻近的pages作为传输的依据,能够大幅的改善page fault的情形。
作者提出一个bubbling algorithm来作为pre-paging的算法。
首先,在还没有fault发生的情况下,从第一页page开始往下传输。
接着,在发生page fault后,从发生fault的那页page开始往前后两个方向传输。
另外,当发生多次的page fault时,可以从不同的地方分别开始传送page,当有两个方向的传输碰面的时候,就停止该方向的传输。此算法会一直持续到所有的page都被传送到destination端为止。
(4 )Dynamic self-ballooning ( DSB )
在migration的过程中,有许多的”free”memory是不需要被传送的,这些free memory的量可大可小,可是如果能够避免传送这些page,是可以大幅提升migration效率的。作者利用[2]提出的Ballooning机制来找出这些free page。
Ballooning机制是说,在guest kernel放进一个ballooning driver,这个driver会经由一个private channel 与hypervisor沟通,hypervisor可以藉由调整balloon的压力来调整给guest memory的大小。当为这个balloon充气(inflate)的时候,guest memory会认为自己拿到的memory太多,于是balloon driver就能够回收pages并且将这些pages归还给hypervisor。相反的,当balloon消气(deflate)的时候,balloon driver可以向hypervisor要求增加memory。
作者们利用这个机制来设计DSB,构成DSB的机制如下:
(1 )Inflate the balloon:
主动将balloon充气,让balloon driver开始回收free memory并归还给hypervisor。
(2 )Detect Memory Pressure
由于DSB执行的过程中,VM仍然在执行,所以有可能会有process需求memory,DSB必须主动的去侦测,且在发现的情况下将balloon消气来要求memory page。
(3 )Deflate the balloon
将balloon消气,然后重复的执行此三个步骤。
在migration之前,让VM执行DSB,能够主动的将free page归还给hypervisor,而根据作者的实验,free page的归还率可以达到95%。DSB的技术除了用在post-copy之外,也能改善pre-copy的算法,使得pre-copy算法变得更有效率。作者在paper的后面有提出实验证明。
Evaluation
( 1 )Stress testing
从图4可以看出,不管是使用pre-copy还是post-copy,DSB的使用都能够明显的减少total migration time。在大部分指令是读取memory的情况下,pre-copy能够比post-copy有更好的performance;但是在大部分指令是写入的情况下,post-copy则明显的比pre-copy好很多。这是因为在传送memory page的次数上,post-copy只需要传一次,而pre-copy会因为需要传送大量的dirty memory,所以造成performance下降。
根据图4,我们还可以了解到post-copy对应用类型是不可知的。由于写密集的应用产生脏页的速率可能会比传输速率更大,所以pre-copy对其是非常敏感的。而由于实现机制不同,post-copy则没有这么敏感,在total migration time方面表现得非常平稳。
从图5我们可以得知,不论是针对写密集抑或读密集应用,DSB的运用可以大幅降低post-copy的downtime,小幅降低pre-copy的downtime。而对pre-copy的downtime影响最大的因素还是应用的类型。
图6告诉我们,DSB能够大幅减少post-copy和pre-copy的总传输页面。
表2表示的是pre-paging算法在post-copy中的用处。它可以把大量的network faults转换为minor faults。
( 2 )Degradation,Bandwidth, and Ballooning
为了量化migration对running service的影响,作者做了一个有趣的实验:在2台物理机之间来回迁移一个正在执行内核编译的VM。实验结果图7表示,VM执行内核编译,在no-migration,post-copy, pre-copy DSB, pre-copy w/o DSB四种方法的影响下的完成时间。很明显,无论是pre-copy还是post-copy,DSB都可以大幅减少对running service的影响。因为DSB减少了需要传输的总页面,继而减小了migration对网络资源的竞争,迁移页面可以尽快地传输到target host。因为内核编译并不是非常倾向于写密集的应用,所以post-copy和pre-copy的表现并没有太大差异。
![](https://img-my.csdn.net/uploads/201207/19/1342671402_1217.png)
众所周知,Netperf是一个持续的占用高带宽的网络应用,有较高的脏页率。同样的,如图8所示,虽然DSB能减少migration对running service的影响,但是post-copy的表现比pre-copy是略好的。
![](https://img-my.csdn.net/uploads/201207/19/1342671520_7643.png)
图9和10分别表示了post-copy和pre-copy对网络带宽的影响,实验的running service为Netperf。结果显示,对于脏页率高的service,pre-copy的迭代次数多,需要传输的脏页过多导致对带宽的影响更久更高。
图11显示balloon interval对kernel compile的完成总时间的影响。根据实验,对于该service,4-10秒的时间间隔比较折衷。越频繁的balloon,对VM的负载(running service)影响越大。
Conclusion
Pre-copy的优势在于能够让使用者几乎没有migration的感觉,像是在on-line game这样的环境中也能有相当好的表现。Post-copy虽然在total migration time有较好的表现,但是在pull phase最一开始的阶段,performance会大幅下降,这是个致命伤。
此外,根据paper,post-copy目前还不是reliable的,一旦在migration的途中,destination host 发生crash,则有可能会失去这台VM内的数据。Pre-copy则不会,pre-copy在所有的stage中,都至少会有一份完整且一致的memory and processorstate存在。这也是post-copy需要改善的地方。