保存整个过程以在重启后继续


54

我针对数学中的一个相当困难的问题开发了一种算法,可能需要几个月才能完成。由于我只有有限的资源,因此我在Ubuntu 12.04(x86)笔记本电脑上启动了此程序。现在,我想安装一些更新并实际重新启动笔记本电脑(“请重新启动”消息很烦人)。

有没有一种方法可以保存包括分配的内存在内的整个过程,以便在重启后继续运行?

以下是有关您可能需要的过程的一些信息。如果需要,请随时询问更多信息。

  • 我在终端用命令“ ./binary > ./somefile &”或“ time ./binary> ./somefile&” 调用了该过程,我真的记不起来了。
  • 它将一些调试信息打印到std :: cerr(不是很常见)。
  • 它目前正在使用大约600.0 kiB,即使它会增加,也不太可能迅速增加。
  • 该过程以正常优先级运行
  • 内核是3.2.0-26-generic-pae,cpu是AMD,操作系统是Ubuntu 12.04 x86。
  • 它从9天14个小时开始运行(太长了,无法取消;-))

3
出于好奇,您在算什么?
维克多·梅尔格伦

3
@ user1261166:我使用分支剪切法研究了目标访问问题(这是对旅行推销员问题的扩展)。因此,我需要尽可能多地了解某些特殊的高维多面体。基本上,它把一个大问题变成了一个巨大的问题,然后尝试解决一点,然后减少它。
stefan 2012年

5
它并不能完全回答您的问题,但是您是否考虑过将来在专用集群上运行代码?这些几乎没有关闭,我敢肯定有一些可用的计算网格。它们不仅一直处于运行状态,而且运行速度也要快很多(特别是如果您可以并行化代码)。您甚至可以自己设置一个(查找Oracle Grid Engine)。
Wojtek Rzepala 2012年

我从来没有想到过这个问题如此受欢迎(至少比我其他所有问题都受欢迎)。由于该过程现在已经完成(出乎意料,尽管没有崩溃),所以我将很快尝试每种方法。感谢大家!
stefan 2012年

Answers:


41

最好/最简单的解决方案是更改程序以将状态保存到文件中,然后重用该文件以还原过程。

根据有关应用程序快照的维基百科页面,有多种选择:

  1. 也有低温,但似乎无法维持
  2. Linux检查点/重新启动似乎是一个不错的选择,但是您的内核需要CONFIG_CHECKPOINT_RESTORE启用。
  3. criu可能是最新的项目,可能是您最好的选择,但还取决于您的发行版可能尚未设置的某些特定内核选项

这已经为时已晚,但是另一种更动手的方法是在专用VM中启动过程,然后仅挂起和还原整个虚拟机。根据您的管理程序,您还可以在不同主机之间移动计算机。

对于将来,请考虑您在哪里运行长时间运行的进程,如何使它们并行化以及如何处理问题,例如,满磁盘,进程被杀死等。


20

一种相当“便宜”的方法是在VM中进行处理(例如,使用VirtualBox)。关闭前,请先挂起VM并保存状态。引导后,还原虚拟机和状态。

这确实具有需要终止并重新启动作业的缺点。但是,如果实际上要运行几个月,那么相差九天就变得微不足道了(六个月内增加了5%)。


编辑:我刚刚意识到,乌尔里希(Ulrich)已经在他的清单上未编号的项目4中提到了这一点。

我仍然鼓励您将此作为一种选择,尤其是因为没有其他选择看起来像是可靠的解决方案。每个都有其可能无法正常工作的原因。

我想最好的办法是尝试其中一种,如果不起作用,请在VM中重新启动作业。


15

看一下工具CryoPID

在主页上:“ CryoPID允许您捕获Linux中正在运行的进程的状态并将其保存到文件中。然后,该文件可用于稍后在重新启动后甚至在另一台计算机上恢复该进程。”


4
之前使用它来保存在Linux机器上运行的python脚本的状态,并将其移至FreeBSD机器上并在此处恢复。那里有奥术魔法;)
蒂姆(Tim

我不知道FreeBSD和Linux是二进制兼容的。我刚刚学到的东西很有趣。但这是否意味着它们具有完全相同的内存模型?在我看来,它们具有相同的syscall约定,相同的libc(我想fbsd使用glibc),在asm级别上具有相同的确切调用约定等,这在我看来是令人难以置信的。这些不兼容对我来说听起来就像您采用了MacOS进程并转储了一样。它放在Windows盒子上;真的很棒。

最近有人尝试过吗?该网站不见了,我找不到.deb,从源代码构建失败,等等。我想知道是否有可能在花更多的时间之前。如果重要的话,我会选择Debian。
约翰·P

1
@JohnP现在可以在GitHub上使用:github.com/maaziz/cryopid
starbeamrainbowlabs

7

如果最终需要重新启动程序,我建议您花一些时间在代码中添加一些功能,这些功能可能会节省将来的时间。

如果该进程将要长时间运行,那么如果您的进程在运行时崩溃,那么在重新启动计算机时保存整个进程状态可能没有太大帮助。

我鼓励您将程序输出到文件“检查点”数据。此数据应足以使您的程序能够从保存检查点文件时的状态恢复。您无需保存整个过程,只需保存计算中使用的相关变量的快照即可,足以使您的计算从中断处继续进行。您的代码还需要包括一些从此文件中读取数据的方式以获得其开始状态。

您可以设置代码,以便在发送信号时保存其中一个检查点文件,因此可以随时保存计算的“状态”。

另外,能够看到数据如何随着计算的进行而变化本身就很有趣!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.