我知道在Linux上有一个被称为“OOM杀手”的内核function。 当OOM(内存不足) 情况消退时 ,有没有像“Process Resurrector”这样的东西?
我知道这个function很难实现,因为各种各样的原因,但是有什么东西可以接近吗?
编辑 :例如:“Resurrector”将有一块内存保证它存储一个有限的过程信息 (如命令行,环境等)(即不是一个完整的过程代码和数据!)。 一旦OOM条件被清除,“Resurrector”可以通过列表并“复活”一些进程。
从我收集到现在,似乎没有function类似于我所要求的。
没有。一旦一个进程被OOM Killer杀死,它已经死了。 你可以重新启动它(资源允许),如果它是由系统管理的(也许通过inittab),它可能会以这种方式重新启动。
编辑:作为一个思想实验,思考一个过程的复活是什么意思。 即使您可以存储整个进程状态,也不会因为进程中断而导致内存不足的原因。
所以最好的可能是因为存储它的启动状态(命令行等)。 但是这也不好,因为再一次,这可能是为什么系统首先耗尽内存!
而且,如果你以这种方式复活了一个过程,就不会有什么可能出错的。 如果过程控制硬件呢? 如果过程控制不应该运行多次? 如果连接到不存在的tty(因为sshd是被杀死的进程之一)呢?
在系统不可能意识到的进程周围存在大量的上下文。 唯一明智的就是内核所做的事情:杀死吸盘并继续。
我想你可以想象一个hibernate-process-to-disk策略,但是由于我们内存不足(包括交换),这意味着要么预先保留一些磁盘空间,要么决定为此分配磁盘空间飞。 这两种策略中的任何一种都可能无法处理相关流程的规模。
总之:不,你不会从OOM杀手那里回来。 这是一个杀手,你只需要处理它。
当然没有。 否则,如果没有更多的内存来存储被杀死的进程,哪里可以存储? 🙂
事情是只有当所有可用内存耗尽时,OOM杀手才会进入游戏,RAM和磁盘交换内存。 如果一个“流程再造者”能够在条件消退之后“复活”一个流程,它应该能够在“杀手”启动的时候存储在某个地方。 但是因为杀手只有在没有可用的记忆的时候才开始,那是不可能的。
当然你可以说“保存到磁盘”,但是,交换内存是一个磁盘。 如果要限制进程的内存消耗,请使用ulimit
功能并通过ps
程序或/proc
文件系统手动跟踪您的mem使用情况。 “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; }' )