非常快的虚拟机回滚

简介:是否有一个虚拟机针对快速内存中回滚到以前的状态进行了优化?

我在StackOverflow和SuperUser上试过了 – 也许这是问这个问题的正确的地方。 🙂

我正在寻找将虚拟机回滚到以前已知状态的最快方法。 我会做很多回滚到相同的状态。 拍摄快照可能会很慢,但回滚需要很快。

理想情况下,我希望回滚的性能尽可能接近单个memcpy()的性能。

我目前正在testing我的便携式机器(Mac OS X)上的东西,但稍后会将其部署到强大的Linux服务器上。 可移植性会很好,但只能在Linux上运行。 商业解决scheme是好的,如果他们完成工作。

下面是memcpy()在我的机器上花费的时间:( 代码在这里 )

     尺寸时间
  ========= ========= 
     64 MB 0.030 s
    128 MB 0.085秒
    256 MB 0.140秒
    512 MB 0.290秒
   1024 MB 0.600秒

到目前为止,我已经在我的机器上尝试了VirtualBox和VMWare Fusion。 两者的performance相当。

理想情况下,我也想回滚磁盘状态。 VirtualBox似乎支持“不可变的”磁盘,所有的磁盘I / O都被logging到一个差异文件中,并在回滚时抛出。 这似乎是天作之合。

对于VirtualBox回滚具有2.5 GB分配的RAM的虚拟机,其中保存在磁盘(SSD)上的状态需要约35秒。

由于磁盘I / O预计会很慢,我接下来创build了一个RAM磁盘(格式化为HFS +)并将快照移到那里。 否则,不变的虚拟机回滚到相同的状态需要大约16.5秒。

快照数据占用1.11 GB。 因此,从RAM磁盘回滚时,VirtualBox需要大约15s / 1GB的数据。 这是memcpy()的6.72倍。 (经过Mac OS X的I / O系统是否会导致很多开销?)

由于我知道没有办法在没有先closures的情况下回滚一个VirtualBox虚拟机,并且以后再启动它,这可能是由于其他因素造成的。

理想情况下,pipe理程序将保持所有快照状态在主内存中,并使用memcpy()进行回滚,让我们回滚约5秒钟。 (一个更智能的pipe理程序可能会在页面上执行写入复制,而只能实际更改的回滚内存页面。

是否有任何pipe理程序针对经常性工作负载回滚进行了优化? 如果不是:自己实施这样的事情最可行的办法是什么?

(我也对stream程级别的回滚做了一些研究,似乎有一些针对Linux的有趣的解决scheme,但是对任意应用程序进行回滚以及能够回滚I / O都是很大的优势。)

(我真正想要做的就是回滚到任意Java应用程序中的检查点,理想的情况是和他们的I / O一起,我只发现了一个死的研究项目来回滚一个JVM,但是也许有人知道更多的当前工作呢?但是需要处理非常任意的Java应用程序。)

我不知道你的实际需求是什么。 但是,是否有可能运行多个克隆并进行某种循环负载平衡? 然后你可以在后台回滚这些机器,你有更多的时间来做这件事。

不是真的。 快照的目的是对当前系统状态进行“拍摄”,以便在不久的将来(软件更新或安装)出现问题时,快速返回到安装之前的状态。 这样你就不必从备份中完全恢复。 这些快照只能保留很短的时间,并保持每个VMWare的清理。

类似于你正在寻找的东西是VMWare站点恢复pipe理器,它允许你有一个完全复制的虚拟机基础架构,只会部分地为你所需要的工作。 我不认为它完全符合你的目的,因为它更多的是虚拟机的镜像副本,而不是虚拟机的“回滚”状态。

我知道的有关VMWare和VirtulBox的另一个选项是创build一个计划任务,使用命令行(PowerCLI)自动执行快照和恢复操作。 然后它将创build快照并按计划恢复。

另外,如果您不得不频繁快照并回滚,那么在您的过程中可能会出现问题。 也许可以解释你为什么这样做会得到更好的回应。

编辑

我认为更好的方法可能是只运行多个虚拟机,全部使用相同的基准。 基本上克隆第一个到3或4个额外的虚拟机,并使用它们进行testing。 这样做只要在VM1上完成最初的一组testing,就在VM2上开始testing。 在此过程中使用快照回滚VM1。 然后,一旦VM2完成,在回滚VM2时移至VM3。 然后在VM3完成后回到VM1并回滚VM3。 如果在完成VM3时VM1尚未完成回滚,请添加额外的VM。 这样,当你到达“线路”的末尾时,可以这么说,VM1将会回滚完成。 由于它是自动化的,所以在完成testing后,可以使用PowerCLI或某种命令行来恢复快照。