【问题标题】:How to "hibernate" a process in Linux by storing its memory to disk and restoring it later?如何通过将内存存储到磁盘并稍后恢复来“休眠”Linux中的进程?
【发布时间】:2011-01-09 05:42:20
【问题描述】:

是否可以在 linux 中“休眠”进程? 就像笔记本电脑中的“休眠”一样,我会将进程使用的所有内存写入磁盘,释放 RAM。然后稍后,我可以“恢复进程”,即从内存中读取所有数据并将其放回 RAM,然后我可以继续我的进程吗?

【问题讨论】:

标签: linux linux-kernel


【解决方案1】:

我曾经维护CryoPID,这是一个完全按照您所说的程序执行的程序。它将程序地址空间的内容、VDSO、文件描述符引用和状态写入一个文件,以后可以重建该文件。 CryoPID 在 Linux 本身没有可用的钩子时启动,并且完全在用户空间工作(实际上,它仍然可以工作,具体取决于您的发行版/内核/安全设置)。

问题是(确实)套接字、待处理的 RT 信号、大量 X11 问题、glibc 缓存 getpid() 实现等等。随机化(尤其是 VDSO)在 Bernard 离开后,对我们中的少数人来说是不可逾越的。然而,它很有趣,并成为了几篇硕士论文的主题。

如果您只是在考虑一个可以保存其运行状态并直接重新启动到该状态的程序,那么从程序本身中保存该信息就更容易了,也许是在服务信号时。

【讨论】:

  • 遗憾的是,截至 2014 年 7 月,CryoPID 不再受到维护,也无法在最新的内核上运行。但与此同时,新项目诞生了(甚至在 TCP 连接“休眠”中也采取了一些步骤)。我在下面放了一个answer 更新信息。看看这个! ;)
  • @dappiu 太好了 - 但 CryoPID 只是这个答案中的一个 示例 来说明它有多么棘手,我继续建议他们处理将状态保存在程序本身,以一种可以轻松恢复的方式。 CryoPID 停滞不会降低答案的相关性。
  • Cryopid2 最近活跃(2013 年):sourceforge.net/projects/cryopid2
【解决方案2】:

我想在这里更新 2014 年的状态。

接受的答案建议将 CryoPID 作为执行检查点/恢复的工具,但我发现该项目是无人维护的,并且无法使用最近的内核进行编译。 现在,我发现了两个积极维护的项目,提供应用程序检查点功能。

我建议的第一个是CRIU,因为我运行它的运气更好 主要在用户空间执行检查点/恢复,并且需要启用内核选项 CONFIG_CHECKPOINT_RESTORE 才能工作。

Checkpoint/Restore In Userspace,或 CRIU(发音为 kree-oo,国际音标:/krɪʊ/,俄语:криу),是用于 Linux 操作系统的软件工具。使用此工具,您可以冻结正在运行的应用程序(或其中的一部分)并将其作为文件集合检查到硬盘驱动器。然后,您可以使用这些文件从冻结点恢复和运行应用程序。 CRIU项目的显着特点是主要在用户空间实现。

后者是DMTCP;引用他们的主页:

DMTCP(分布式多线程检查点)是一种透明地检查多个同时应用程序状态的工具,包括多线程和分布式应用程序。它直接在用户二进制可执行文件上运行,无需任何 Linux 内核模块或其他内核修改。

关于论点还有一个不错的维基百科页面:Application_checkpointing

【讨论】:

    【解决方案3】:

    提到ctrl-z 的答案实际上是在谈论用信号停止进程,在这种情况下是SIGTSTP。您可以使用kill 发出停止信号:

    kill -STOP <pid>
    

    这将暂停进程的执行。它不会立即释放它使用的内存,但由于其他进程需要内存,停止的进程使用的内存将逐渐换出。

    当你想再次唤醒它时,使用

    kill -CONT <pid>
    

    如果您希望停止的进程能够在系统关闭/重新启动后继续存在,则确实需要更复杂的解决方案,例如 CryoPID - 听起来您并不需要。

    【讨论】:

      【解决方案4】:

      Linux Kernel 现在已经部分实现了检查点/重启futures:https://ckpt.wiki.kernel.org/,状态为here

      一些有用的信息在lwn(linux周刊): http://lwn.net/Articles/375855/http://lwn.net/Articles/412749/......

      所以答案是“是”

      【讨论】:

      • 用户空间程序叫做blcr。
      【解决方案5】:

      问题在于恢复程序已打开的流(文件和套接字)。

      当您的整个操作系统休眠时,本地文件等显然可以恢复。网络连接不会,但是访问互联网的代码通常会进行更多的错误检查等,并且可以在错误条件下(或应该)幸存下来。

      如果您进行了按程序休眠(没有应用程序支持),您将如何处理打开的文件?如果另一个进程在此期间访问这些文件怎么办?等等?

      在程序未加载时保持状态会很困难。

      简单地暂停线程并让它交换到磁盘会产生同样的效果吗?

      或者在虚拟机中运行程序,让虚拟机处理挂起。

      【讨论】:

        【解决方案6】:

        简短的回答是“是的,但并不总是可靠的”。查看 CryoPID:

        http://cryopid.berlios.de/

        打开文件确实是最常见的问题。 CryoPID 明确声明:

        恢复打开的文件和偏移量。 已保存的临时文件 未链接且无法在 文件系统总是保存在 图片。其他不存在的文件 on resume 尚未恢复。 支持保存文件内容 这种情况是有计划的。

        虽然 CryoPID 支持 tcpcp 恢复连接,但同样的问题也会影响 TCP 连接。

        【讨论】:

        • 点击提交按钮后,我现在意识到这读起来很像 CryoPID 的垃圾邮件/广告。不是——我只是该实用程序的满意用户,真的。
        【解决方案7】:

        我扩展了 Cryopid,生成了一个名为 Cryopid2 的包,可从 SourceForge 获得。这个可以 迁移进程以及使其休眠(以及任何打开的文件和套接字 - 数据 在 sockets/pipes 中被吸入休眠的进程并吐回这些时 进程重新启动)。

        我没有积极参与这个项目的原因是我不是内核开发人员 - 两者都是 这个(和/或原来的 cryopid)需要让一个可以让他们运行的人加入 使用最新的内核(例如 Linux 3.x)。

        Cryopid 方法确实有效 - 并且可能是通用过程的最佳解决方案 我遇到过 Linux 中的休眠/迁移。

        【讨论】:

          【解决方案8】:

          简短的回答是“是”。你可以先看看这个以获得一些想法:ELF executable reconstruction from a core image (http://vx.netlux.org/lib/vsc03.html)

          【讨论】:

          • 有趣的链接;但链接确实指出它不能可靠地工作
          【解决方案9】:

          正如其他人所指出的,操作系统很难提供此功能,因为应用程序需要内置一些错误检查来处理损坏的流。

          不过,附带说明一下,一些使用虚拟机的编程语言和工具明确支持此功能,例如 Self programming language

          【讨论】:

            【解决方案10】:

            Ctrl-Z 增加了进程页面被交换的机会,但它并没有完全释放进程的资源。完全释放进程资源的问题在于,文件句柄、套接字之类的东西是进程可以使用的内核资源,但不知道如何自行持久化。所以 Ctrl-Z 是最好的。

            【讨论】:

              【解决方案11】:

              早在 2.2 和 2.4 天就有一些关于 Linux 的检查点/恢复的研究,但它从未超过原型。可能的某些值是可能的(在其他答案中描述了警告)-我可以编写一个内核模块来做到这一点,这是可能的。但是对于可能的共同价值(我可以从商业 Linux 发行版的 shell 中完成),目前还不可能。

              【讨论】:

                【解决方案12】:

                这是集群操作系统的最终目标。 Mathew Dillon 在他的 Dragonfly BSD 项目中投入了大量精力来实现类似的功能。

                【讨论】:

                • 这个特性在 Dragonfly BSD 中完全实现了吗?
                【解决方案13】:

                添加另一个解决方法:您可以使用 virtualbox。在常规虚拟机中运行您的应用程序,并在需要时简单地“保存机器状态”。 我知道这不是一个答案,但我认为当没有真正的选择时它会很有用。

                如果你不喜欢 virtualbox,vmware 和 Qemu 也一样好。

                【讨论】:

                  【解决方案14】:

                  Linux 中有ctrl+z,但我不确定它是否提供您指定的功能。我怀疑你问了这个问题,因为它没有

                  【讨论】:

                    猜你喜欢
                    • 2011-08-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-06-10
                    • 2019-03-10
                    • 2011-01-25
                    相关资源
                    最近更新 更多