非常快速的虚拟机回滚

非常快速的虚拟机回滚

摘要:是否有针对快速内存回滚到以前的状态进行优化的虚拟机?

我在 StackOverflow 和 SuperUser 上尝试过但徒劳无功——也许这是提出这个问题的正确地方。:)

我正在寻找将虚拟机回滚到先前已知状态的最快方法。我将多次回滚到同一状态。拍摄快照可能很慢,但回滚必须很快。

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

我目前正在我的便携式机器(Mac OS X)上测试一些东西,但稍后会将其部署到强大的 Linux 服务器上。可移植性会很好,但只在 Linux 上运行就可以了。如果商业解决方案能够完成工作,那就很好了。

为了参考,以下是 memcpy() 在我的计算机上所花费的时间:(代码可在此处获取。

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

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

理想情况下,我还想回滚磁盘状态。VirtualBox 似乎支持“不可变”磁盘,其中所有磁盘 I/O 都记录到差异文件中,并在回滚时丢弃。这似乎是自然而然的事情。

对于 VirtualBox 来说,回滚一个分配了 2.5 GB RAM 的虚拟机,并将状态保存在磁盘(SSD)上大约需要 35 秒。

由于磁盘 I/O 预计会比较慢,我接下来创建了一个 RAM 磁盘(格式化为 HFS+)并将快照移至那里。将其他未更改的 VM 回滚到相同状态需要约 16.5 秒。

快照数据占用 1.11 GB。因此,VirtualBox 从 RAM 磁盘回滚时需要约 15 秒/1 GB 数据。这是 memcpy() 时间的 6.72 倍。(通过 Mac OS X 的 I/O 系统会造成那么多开销吗?)

由于我知道如果不先关闭 VirtualBox VM 然后重新启动它,就无法回滚它,所以这可能是由其他因素造成的。

理想情况下,虚拟机管理程序会将所有快照状态保存在主内存中,并使用 memcpy() 进行回滚,让我们在约 5 秒内回滚。(更智能的虚拟机管理程序可能会在页面上实现写时复制,并且只回滚实际发生更改的内存页面。)

是否有针对频繁回滚的工作负载进行优化的虚拟机管理程序?如果没有:我自己实现这种事情的最可行方法是什么?

(我也对进程级回滚做了一些研究,似乎对 Linux 有一些有趣的解决方案;但让回滚适用于任意应用程序并且能够回滚 I/O 是很大的优点。)

(我真正想要做的是回滚到任意 Java 应用程序中的检查点,最好与它们的 I/O 一起回滚。我只发现了用于回滚 JVM 的死亡研究项目,但也许有人知道更多当前的工作?然而,它需要与几乎任意的 Java 应用程序有关。)

答案1

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

答案2

不是。快照的目的是对当前系统状态进行“快照”,这样如果在不久的将来出现问题(软件更新或安装),它可以快速返回到安装之前的状态。这样您就不必从备份中进行完全恢复。快照只能保留很短的一段时间,并且要保持每个 VMWare 的干净。

与您所寻找的类似的东西是 VMWare Site Recovery Manager,它允许您拥有完全复制的 VM 基础架构,并且只能部分满足您的需要。我不认为它完全符合您的目的,因为它更像是 VM 的镜像副本,而不是 VM 的“回滚”状态。

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

此外,如果您必须如此频繁地进行快照和回滚,那么您的流程可能出了问题。也许解释清楚您这样做的原因会得到更好的回应。

编辑

我认为更好的方法可能是简单地运行多个虚拟机,所有虚拟机都具有相同的基准。基本上将第一个虚拟机克隆到 3 或 4 个其他虚拟机上,并使用它们进行测试。这样做的目的是,一旦在 VM1 上完成原始测试集,就开始在 VM2 上进行测试。在此过程中使用快照回滚 VM1。然后,一旦 VM2 完成,在回滚 VM2 的同时移动到 VM3。然后在 VM3 完成后返回 VM1 并回滚 VM3。如果在完成 VM3 时 VM1 尚未完成回滚,请添加另一个虚拟机。这样,当您到达“行”的末尾时,VM1 将完成回滚。由于它是自动化的,您可以在测试完成后使用 PowerCLI 或某种命令行恢复快照。

相关内容