如何停止Linux进程以供日后执行换出其内存


19

我想停止一个长时间运行的进程,以便不消耗任何CPU或物理内存资源,以期将来恢复同一进程

我知道,CPU部分是可以实现的使用SIGSTOPSIGCONT 信号,但有可能页出(换出在工艺脏页的情况下),立即一(停止)进程的专用内存RSS?


1
这背后的意图是什么?您是否要确保该过程恢复更快?还是要防止敏感数据写入磁盘?或者是其他东西?如果我们知道目的,我们也许可以给出更好的答案。
奥利弗·2016年

13
操作系统将自动执行此操作。确实没有理由做任何特定的事情。
David Schwartz

@oliver我正在创建一个批处理调度程序(github.com/brutusin/wava)。当前的实现提供了非抢占式调度,但是我想转向抢占式调度(能够停止运行的作业),以便在所有正在运行的作业都依赖于排队的作业时优雅地避免某些死锁情况。我需要确切的行为要求,继续停止进程(而不是从检查点创建新进程)
idelvall

1
@DavidSchwartz这是一个冒险的断言
idelvall

@idelvall听起来您不想做任何特殊的记忆。
David Schwartz

Answers:


11

您可能会研究一种称为检查点/还原的技术。这将使您能够执行一个正在运行的进程并将其状态保存到一组文件中,然后在以后还原它。
要使用它,请先安装criu [ gitwiki ]程序(yum install criuapt install criu)。

要检查运行中的进程,请创建一个空目录来保存其文件,然后将cd插入该目录。

mkdir /var/tmp/checkpoint
cd /var/tmp/checkpoint

现在检查点正在运行的进程。在这种情况下,我使用--shell-job,因为我的进程在带有关联tty的shell中运行。

criu dump -t 404 --shell-job

404是我要检查点的进程的pid。当我这样做时,我看到正在运行的进程被杀死,并且/ var / tmp / checkpoint目录中填充了恢复它所需的一组文件。

要还原该过程,请确保我位于带有检查点文件的目录中并进行还原。

cd /var/tmp/checkpoint
criu restore --shell-job

该过程将从运行该终端的地方继续。如果我终止了这个正在运行的进程并criu restore --shell-job再次运行,则该进程将恢复为检查点并再次启动。

希望这可以帮助。


4
这并没有OP所希望的那样。尝试一下-不会减少使用的内存。它将仅从进程专用内存切换到磁盘缓存(由于写出了文件集)。它只是做了一个额外的保存步骤和一个额外的还原步​​骤,并且以相同的方式使用(可弹出)相同的内存。实际上,这可能会使情况变得更糟,因为由于生成了所有要写入的新内容而导致某些内存被复制。
David Schwartz

嘿,@ David很高兴,尤其/tmp是tmpfs(由内存/交换空间支持)时。如果检查点指向普通的磁盘支持的文件系统,则可以vmtouch -e用来从页面缓存中逐出页面,但它仍会临时使用额外的RAM。(除非criu可以选择直接进行I / O(使用O_DIRECT)...)
Peter Cordes,2016年

1
很难知道这是否是OP想要的,因为OP要求一种特定的解决方案,而不是解释他要解决的问题。这可能是一个完美的答案,或者对他可能毫无用处,我们无法确定。
David Schwartz

我还没有详细研究它,但是,似乎还原后的进程是一个新进程(不同的pId),而这并不是我真正需要的...
idelvall

1
@idelvall:这就是大多数检查点/还原样式的工作方式。一个主要用例是在重新启动后保存计算进度。
彼得·科德斯
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.