SnowFlock 快速克隆 Xen VM

这个周末看了一篇关于快速克隆 Virtual Machine(VM)的文章,SnowFlock: Rapid Virtual Machine Cloning for Cloud ComputingSnowFlock 是 University of Toronto 的一个项目,核心想法是把 Unix 操作系统中 fork 的概念引入到云计算,不过不是用来 fork 进程,是 fork 虚拟机,这个 fork 与原始的 Unix fork 有几点不同:

1、VM fork 可以 fork 到其他物理机器上,Unix fork 只能在本机操作系统内 fork;
2、parallel fork,一次 fork 调用可以创建多个 child VMs;
3、VM fork 从 parent VM 那里复制所有的进程和线程。

SnowFlock 从不同的物理机器上 fork 出相同的 VM,这些 VMs 连在一起构建一个私有 cluster,拥有自己的虚拟网络。SnowFlock 根据计算的需要分配计算资源,从众多的物理机器中创建一个合理大小的 Xen VM Cluster,由这个 cluster 来完成目标计算,完成计算后,这个 cluster 就自动消失了。

snowflock

把 Unix 中的 fork 概念用到云计算 VM 克隆中是个很有意思的想法,SnowFlock 如何做到快速克隆呢?做到 fork 并不难,最土的想法就是 fork 时利用虚拟机的 suspend/resume 功能,把 VM suspend 后将整个 VM 文件拷贝到别的机器上然后 resume 运行。但是这个过程太慢,在 VPSee 的 Mac 上 suspend 一个 vmware 虚拟机大概需要 30秒,又需要另外 30秒 resume。SnowFlock 克隆 VM 只需要不到1妙,它是如何做到这点的?

1、VM 文件里包含 memory image,disk image,各种状态、配置信息等,SnowFlock 只复制必要的状态信息(VM descriptor),这样就不必复制包含整个操作系统在内的 VM 文件,如果 disk image 设的是 10GB,那就不必复制 +10GB。Memory-On-Demand 允许 child VM 只在需要某个 memory 页面的时候才去 parent VM 那里克隆,可以在 fork 后进行,减少了初始克隆 VM 的体积;
2、VM 克隆的时候不必克隆所有的 memory image,只需要原始 image 中一小部分信息(Memory State),这又减少了需要克隆的体积;
3、child VM 可以在 fork 到其他机器上后再分配内存。如果先分配内存会造成 memory image 过大,影响克隆速度。如果 parent VM 分配了页面,比如 malloc,但是还没有用到这些页面、没有数据的话这些页面也用不必克隆到 child VM。还有一些可以循环使用的 kernel buffer 也不必克隆,,进一步减少克隆体积;
4、child VM 通常执行类似的代码和数据结构,如果 fork 多个 VMs 的话有助于 multicast;
5、把数据 multicast 给多个 VMs,只要有1个 VM 请求页面,这个页面也会被 multicast 给其他 VMs。一次操作就把数据分发给所有 VMs 还可以减少网络负载。

简单的说就是,尽可能减少 VM 携带的信息量来达到快速克隆的目的,这篇论文指出只需要克隆原 VM 0.1% 的信息就足够运行一个 child VM 了。SnowFlock 在 Xen 3 上实现了上述快速克隆的概念,具体实现过程很复杂,如有兴趣可参考论文和代码。SnowFlock 实现的简单图示:

snowflock

(图片来自 SnowFlock 官方网站和资料。)

评论 (5 Comments)

  1. 目前也在研究cloud computing

  2. 正在研究这个Project,我在服务器上源码安装了SnowFlock,但是安装之后他对我的网卡支持不了,无奈只得看源码.因为他的有一些job我很感兴趣,也希望有兴趣的朋友能够mail我,共同探讨下.

  3. 我的邮箱:dada.chao.liu at gmail.com

  4. 正在找研究方向的我刚接触snowflock不久, 希然自己能从中找出自己能做的东西

  5. 总结的很好啊,我刚刚花费了三天的课余时间看完了这篇论文,英文的看过一遍之后还就是没有这样的中文总结看起来更明白一些。看来还是我自己的英文阅读水平有待提高啊。希望可以多多指教。

发表评论