在Linux中使用Core Dump进行检查点/重启

rog*_*ht9 9 linux coredump checkpoint

可以使用进程的核心转储实现Checkpoint/restart吗?核心文件包含进程的完整内存转储,因此理论上应该可以将进程恢复到转储核心时的状态.

Kaz*_*Kaz 9

是的,这是可能的.GNU Emacs这样做是为了优化其启动时间.它加载一堆Lisp文件来生成一个映像,然后转储一个可以重启的核心.

几年前,我为GNU Make 3.80创建了一个补丁来完成同样的事情(使用从GNU Emacs借来的代码).

使用此补丁,您在make中有了一个新选项:make --dump.该实用程序现在读取您的Makefile,然后它不是执行规则,而是生成核心转储,可以重新启动以执行实际构建(评估已解析的规则树).

这是一个保存,因为项目是如此之大,以至于在源树上加载所有make规则需要30秒!通过此优化,增量构建几乎立即启动,没有半分钟的启动惩罚.

不需要内核支持.所需要的是关于核心文件结构的知识.

除了这种方法之外,多年前还有一个针对Linux的进程检查点项目(想知道发生了什么).

  • Emacs的`unexec`并没有转储*core*文件,而是实现了一些持久的堆机制,这不是完全相同的事情.原始海报可以使用一些检查点库,如https://ftg.lbl.gov/projects/CheckpointRestart/,另见http://en.wikipedia.org/wiki/Checkpointing (3认同)

Bas*_*tch 7

正如我评论的那样,您可以查找应用程序检查点并使用一些库,如Berkley Lab Checkpoint和Restart.但是,这些库并不使用核心(5)转储文件,并且对检查点程序可以执行的操作以及检查点映像中的持久性有多种限制和约定.(打开文件描述符和网络套接字通常不能保留).

一些Unix(也许是一些打补丁的Linux内核)在内核本身有限制的检查点设施(在20世纪80年代Cray Unix有一些).


Ada*_*eld 6

不,如果没有内核的特别支持,这通常是不可能的.内核维护了很多每进程状态,例如文件描述符表,IPC对象等.

如果你愿意做很多简化的假设,比如没有打开的文件,没有开放的套接字,没有生活的IPC对象,没有共享的内存区域等等,那么理论上它是可能的,但在实践中我不相信即使有这些让步,Linux也是可能的.