据我所知,在Linux上有一个称为“OOM Killer”的内核功能。当OOM(Out-Of-Memory)条件消退时,是否存在“Process Resurrector”这样的事情?
据我所知,由于种种原因,这项功能很难实现,但有什么东西可以接近吗?
编辑:例如:“Resurrector”会有一块内存保证用于存储一组有限的过程信息(例如命令行,环境等) 。)(即不是整个过程代码和数据!)。清除OOM条件后,“Resurrector”可以通过列表并“恢复”某些过程。
从我收集的内容来看,似乎没有类似于我所要求的功能。
答案 0 :(得分:5)
没有。一旦一个进程被OOM杀手杀死,它已经死了。您可以重新启动它(资源允许),如果它是由系统管理的(可能是通过inittab),它可能会以这种方式重新启动。
编辑:作为一个思想实验,想想一个过程的复活意味着什么。即使你可以存储整个进程状态,你也不会想要,因为被杀死的进程可能是内存不足的原因。
所以最好的可能是存储它的启动状态(命令行等)。但这也不好,因为这可能是为什么系统首先耗尽内存!
此外,如果你以这种方式复活过程,那就不知道会出现什么问题。如果该过程控制硬件怎么办?如果过程控制不应该多次运行怎么办?如果它连接到不再存在的tty(因为sshd是其中一个被杀死的进程)会怎么样?
系统无法察觉的进程周围有大量的上下文。唯一明智的事情是内核做的事情:杀死傻逼然后继续。
我想你可以想象一个hibernate-the-process-to-disk策略,但鉴于我们内存不足(包括swap),这意味着要么预先保留一些磁盘空间,要么决定分配磁盘空间这在飞行中。任何一种策略都可能无法处理相关过程的大小。
简而言之:不,你不会从OOM杀手那里回来。这是一个杀手,你只需要处理它。
答案 1 :(得分:3)
当然没有。否则,如果没有更多的内存来存储它,可以存储一个被杀死的进程? : - )
事情是,当所有可用内存耗尽时,OOM杀手才会发挥作用,RAM和磁盘交换内存。如果一个“过程复活者”可以在条件消退后“复活”一个过程,它应该能够在“杀手”开始时将它存储在某个地方。但是,由于杀手只在没有内存可用时启动,所以这是不可能的。
当然你可以说“保存到磁盘”,但是,交换内存 是一个磁盘。如果您想限制流程的内存消耗,请使用ulimit
功能并通过ps
程序或/proc
文件系统手动跟踪您的内存使用情况。 “OOM杀手”是一种恐慌措施,不应该对流程非常好。
你可以用ulimit
做什么的例子(也许,没有,但是我不能在我的系统atm上试验OOM查杀)
#!/bin/bash
save_something=$ENV_VARIABLE
( ulimit -Sv 1000000;
perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }'
)
echo "killed, resetting"
( ulimit -Sv 1000000;
export ENV_VARIABLE="$save_something"
perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }'
)