当Linux开始交换时,你基本注定了。 系统很快就不会对任何input作出反应,而是快乐地交换直到天数结束。
你能想到一个可以保存所有进程的命令,因此(同时)允许你打开一个干净的shell,在这个shell中你可以检查问题的根源,并且杀死所有内存的进程。 (我想这不是件容易的事情,因为内存可能完全被占满了,所以你需要换掉更多的内存来收集打开一个shell的空间,另一方面,所有其他的交换过程都必须停止。)
如果你把这样一个命令绑定到一个热键,那么也许你可以使用它作为一个紧急button,为你节省了很多时间。 任何想法,如果这是可能的呢? 有人试过这样的事吗? 如果可以意识到这将是一个很酷的function:)
魔术SysReq在其他答案中提到,真的是你所有。 如果你只有SSH访问权限,你可以像这样触发SysReq:
# Enable Magic SysReq since most systems default this off echo 1 > /proc/sys/kernel/sysrq #call OOM Killer to try to free up memory echo f > /proc/sysrq-trigger
制作一个可执行的脚本,并且一旦你注意到这个交换就可以给你一个机会。 如果您有足够的内存来处理临时内存高峰,或者如果在内存不足的情况下使用随机程序,则禁用交换也是一个选项。
在一个相关的说明中,如果你有一个负载快速增长的远程系统,你需要杀死它,你可以使用它来强制重启,而不是干脆closures:
echo 1 > /proc/sys/kernel/sysrq #Trigger BIOS reset echo b > /proc/sysrq-trigger
一个(次优的)解决scheme是提供较less的交换。
这个想法是,当你在绝望的时候举起你的手, OOM Killer会踢。
我在有限的内存机器上使用Linux的经验表明
用于交互式使用
一些特殊情况可以让你延长这些限制。 大但很less活动的后台进程将“记忆”在内存中,但只会偶尔活跃起来,所以对可用性问题没有太多的贡献。
无论如何,计划是调整可用的交换,以便一旦机器太忙,你不能合理地用手杀死东西,OOM杀手踢。
这并不是最理想的(尽pipeOOM杀手可以使用多种启发式方法),但很难确定它会select“正确”。
魔术SysRq是最接近你的button,我知道…
从来没有尝试过,但也许:
killall -SIGSTOP <main commands>
看到man killall看你如何可以定制你的需求。 一般来说,你可能想要用ulimit来运行进程来控制它们,并用像Nagios这样的东西来监视内存的使用情况(参见gazillion的“对…的监视…”)。
你也可以尝试用nice -20 bash ,你应该得到一个响应式的shell…