Linux “之后”;“OOM Killer”;,是否有一个“问题”;“再校长”;?

Linux “之后”;“OOM Killer”;,是否有一个“问题”;“再校长”;?,linux,out-of-memory,Linux,Out Of Memory,我知道Linux上有一个内核功能,称为“OOM杀手”。当OOM(内存不足)状况消退时,是否存在“进程重新存储”这样的情况 我知道由于各种原因,这个功能很难实现,但是有什么东西接近它吗 编辑:示例:“Resurector”将保证有一块内存,用于存储有限的过程信息集(例如命令行、环境等)(即不是整个过程代码和数据!)。一旦OOM条件被清除,“Resurrector”就可以遍历列表并“resurt”一些进程 从我收集到现在,似乎没有类似于我所要求的功能。没有。一旦一个进程被OOM杀手杀死,它就死了。您

我知道Linux上有一个内核功能,称为“OOM杀手”。当OOM(内存不足)状况消退时,是否存在“进程重新存储”这样的情况

我知道由于各种原因,这个功能很难实现,但是有什么东西接近它吗

编辑:示例:“Resurector”将保证有一块内存,用于存储有限的过程信息集(例如命令行、环境等)(即不是整个过程代码和数据!)。一旦OOM条件被清除,“Resurrector”就可以遍历列表并“resurt”一些进程


从我收集到现在,似乎没有类似于我所要求的功能。

没有。一旦一个进程被OOM杀手杀死,它就死了。您可以重新启动它(资源允许),如果它是由系统管理的(可能通过inittab),那么它可能会以这种方式重新启动

编辑:作为一个思维实验,思考一个过程的复活意味着什么。即使您可以存储整个进程状态,您也不会希望这样做,因为进程被终止可能是内存不足的原因

因此,最好的方法是存储它的启动状态(命令行等)。但这也不好,因为同样,这可能是系统内存不足的原因

此外,如果您以这种方式重新启动了一个流程,那么很难说会出现什么问题。如果过程控制硬件怎么办?如果流程控制不应该运行多次,该怎么办?如果它连接到一个不再存在的tty(因为sshd是被杀死的进程之一),该怎么办

在一个过程中,有大量的上下文是系统不可能意识到的。唯一明智的事情是内核所做的事情:杀死这个笨蛋然后继续

我想您可以想象一种休眠进程到磁盘的策略,但考虑到内存不足(包括交换),这意味着要么预先保留一些磁盘空间,要么决定动态分配磁盘空间。这两种策略中的任何一种都可能无法处理所涉流程的规模


简言之:不,你不能从杀人凶手那里回来。它是一个杀手,你只需要处理它。

当然没有。否则,如果没有更多内存来存储被杀死的进程,它可以存储在哪里?:-)

问题是,只有当所有可用内存(包括RAM和磁盘交换内存)耗尽时,OOM killer才会发挥作用。如果“进程恢复器”可以在条件消失后“恢复”进程,那么它应该能够在“杀手”开始时将其存储在某个地方。但由于killer只在没有可用内存时启动,所以这是不可能的

当然,您可能会说“保存到磁盘”,但交换内存是一个磁盘。如果要限制进程的内存消耗,请使用
ulimit
功能,并通过
ps
程序或
/proc
文件系统手动跟踪内存使用情况。“OOM杀手”是一种恐慌措施,不应该对进程很好

您可以使用
ulimit
做什么的示例(也许没有,但我无法在我的atm系统上尝试OOM杀戮)


在磁盘上?这不就是“休眠”的意义吗?@Eric-当内存(RAM和磁盘(交换)都用完时,OOM杀手就会被执行。所以没有地方存储它,OOM killer只是作为最后的手段运行。@jldupont-这正是交换内存、磁盘内存的目的。@Pavel,@bjaref:请重新阅读这个问题(我会强调原来的问题)。@Pavel:我知道你在描述“OOM killer”的内部工作原理,谢谢你。但是,你是在说我的建议不可能实现,我认为其中存在一个问题:我正在假设一个解决方案,该解决方案将“OOM杀手”代理人和可能的“复活者”结合起来。在我看来,这个组合可能是完全合理的。我不明白为什么人们想结束这个问题,因为它是非常面向编程的:程序必须如何处理OOM条件/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; }'
)