当 Linux 开始交换时,您基本上就完蛋了。很快系统将不再对任何输入做出反应,但会愉快地交换直到世界末日……
您能否想到一个可以保存所有进程的命令,从而(同时)允许您打开一个干净的 shell,您可以在其中检查问题的根源并终止消耗所有内存的进程?(我想这并不容易,因为内存可能已经完全填满,您需要换出更多内存来收集打开 shell 的空间,另一方面,所有其他交换进程都必须停止。)
如果您将这样的命令绑定到热键,那么也许您可以将其用作紧急按钮,从而节省大量时间。您知道这是否可行吗?以前有人尝试过这样的事情吗?如果有人能意识到这一点,那将是一个很酷的功能 :)
答案1
魔法系统请求正如其他答案中提到的,这确实是您所拥有的全部。如果您只有 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
用这个脚本制作一个可执行脚本,并在您注意到交换时立即执行它,这可能会给您一个机会。如果您有足够的内存来处理临时内存峰值,或者如果您在内存不足时可以终止随机程序,那么禁用交换也是一个选择。
与此相关,如果你有一个远程系统负载过大,你需要终止它,你可以使用这个来强制重启而无需彻底关闭:
echo 1 > /proc/sys/kernel/sysrq
#Trigger BIOS reset
echo b > /proc/sysrq-trigger
答案2
一个(次优!)解决方案是提供较少的交换。
这个想法是,当你绝望地举手投降的时候OOM 杀手开始。
讨论
我在内存有限的机器上使用 Linux 的经验表明
供互动使用
- 最多使用 100% 的 RAM,GUI 就可以了
- 使用 100% 到 150% 的 RAM 效果很好,尽管你可能会遇到一些命令行延迟
- 使用 150% 到 175-200% 的 RAM慢的但响应速度足够快,可以让您在命令行上进行交互并智能地杀死不必要的东西。
- 除此之外,即使有耐心,也几乎不可能手动修复它。
某些特殊情况允许您扩展这些限制。大型但很少活动的后台进程将“占用”内存,但只会偶尔变为活动状态,因此它们不会对可用性问题造成很大影响。
无论如何,计划是调整可用的交换,以便一旦机器太忙,您无法合理地手动杀死东西,OOM 杀手就会启动。
这不是最佳的(尽管 OOM 杀手有多种启发式方法),很难确定它会选择“正确的”。
答案3
魔法 SysRq是我所知道的最接近你的按钮的东西……
答案4
您也可以尝试一下nice -20 bash
,您应该会得到一个响应的 shell...