我知道在Linux上有一个被称为"OOM杀手“的内核功能。当OOM (内存不足)条件减弱时,是否存在“进程复活器”这样的东西?
我知道由于各种原因,这个功能很难实现,但是有什么东西可以接近它吗?
编辑:示例:“复活器”将有一个内存块,用于存储有限的进程信息(例如命令行、环境等)。(即不是一个完整的流程代码&数据!)。一旦OOM条件被清除,“复活者”可以通过列表“复活”一些过程。
从我收集到的到现在,似乎没有类似于我所要求的功能。
发布于 2009-12-22 15:00:46
不是的。一旦一个过程被OOM杀手杀死,它就死了。您可以重新启动它(如果资源允许的话),如果它是由系统管理的(可能是通过inittab ),那么它可能会以这种方式重新启动。
编辑:作为一个思想实验,想想一个过程的复活意味着什么。即使您可以存储整个进程状态,您也不会想这样做,因为终止的进程可能是内存不足的原因。
所以最好的方法就是存储它的启动状态(命令行等等)。但是这也是没有好处的,因为这也可能是系统一开始就耗尽内存的原因!
此外,如果你以这种方式复活了一个过程,就不知道会出什么问题了。如果进程控制硬件怎么办?如果进程控件不应该运行不止一次,该怎么办?如果它已经连接到一个已经不存在的tty (因为sshd是被杀死的进程之一),该怎么办?
在系统不可能知道的进程中,有大量的上下文。唯一明智的事情是内核所做的事情:杀死傻瓜,然后继续。
我想您可以想象一种hibernate进程到磁盘的策略,但考虑到我们的内存不足(包括交换),这意味着要么预先预留一些磁盘空间,要么决定动态分配磁盘空间。这两种策略中的一种可能无法处理所涉进程的规模。
简而言之:不,你不能从OOM杀手那里回来。它是个杀手,你只需要面对它。
发布于 2009-12-22 15:02:51
当然没有。否则,如果没有更多的内存来存储,那么被杀死的进程可以存储在哪里?:-)
问题是,OOM杀手只有在所有的可用内存耗尽时才会发挥作用,无论是内存还是磁盘上的交换内存。如果一个“过程复活者”能够在条件消退后“复活”一个过程,它应该能够在“杀手”开始的时候将它存储在某个地方。但是,因为只有当没有可用的内存时,杀手才会启动,这是不可能的。
当然,您可能会说“保存到磁盘”,但是交换内存是一个磁盘。如果要限制进程的内存消耗,请使用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; }'
)https://stackoverflow.com/questions/1946890
复制相似问题