当 Linux 开始交换时,你基本上注定要失败。很快系统将不再对任何输入做出反应,但很高兴地切换到天结束......
你能想到一个包含所有进程的命令,因此(同时)允许你打开一个干净的 shell,你可以在其中检查问题的根源并杀死占用所有内存的进程?(我想这并不容易,因为由于内存可能已完全填满,您需要换出更多内存以收集空间以打开 shell,另一方面,必须停止所有其他交换过程。)
如果您将这样的命令绑定到热键,那么也许您可以将其用作紧急按钮,从而为您节省大量时间。如果这可能的话,有什么想法吗?以前有人尝试过这样的事情吗?如果有人能意识到这一点,那将是一个很酷的功能:)
其他答案中提到的Magic SysReq确实是您所拥有的。如果您只有 SSH 访问权限,您可以像这样触发 SysReq:
从中制作一个可执行脚本并在您注意到交换时立即执行它可能会给您一个机会。如果您有足够的内存来处理临时内存峰值,或者您可以在内存不足时终止随机程序,则禁用交换也是一种选择。
在相关说明中,如果您的远程系统负载迅速增加并且您需要将其杀死,您可以使用它来强制重新启动而无需完全关闭:
一种(次优!)解决方案是提供更少的交换。
这个想法是,大约在你绝望地举起双手的时候,OOM 杀手开始了。
讨论
我在有限内存机器上使用 linux 的经验表明
用于交互使用
一些特殊情况将允许您扩展这些限制。大型但很少活跃的后台进程将“坐”在内存上,但只是偶尔会变得活跃,因此它们不会对可用性问题产生很大影响。
无论如何,计划是调整可用的交换,这样一旦机器太忙,你就不能合理地手动杀死东西,OOM 杀手就会介入。
这不是最优的(尽管 OOM 杀手有多种启发式方法),很难确定它会选择“正确”。
Magic SysRq是我所知道的最接近您的按钮的东西......
从来没有试过这个!,但也许:
看看
man killall
你可以如何根据需要定制它。通常,您可能希望使用 ulimit 运行进程以控制它们,并使用 Nagios 之类的东西监控内存使用情况(请参阅 gazillion 'What monitoring for ...' questions for alternatives)。你也可以尝试一下
nice -20 bash
,你应该得到一个响应式外壳......