“杀死最大进程”按钮

Rea*_*onk 15 process

这台笔记本电脑有一个 SSD,因此我决定省略交换。这在大多数情况下效果很好,但有时 RAM 会变得有点短,计算机变得非常缓慢并趋于冻结。有没有办法实现“杀死最大进程”按钮,该按钮会直接进入内核,以防我注意到冻结速度足够快?或者,因为它是一台计算机,当它开始冻结并拍摄最大的过程本身时,启发式也很好。

phe*_*mer 13

从您的评论来看,听起来系统只是在交换。

Linux 有一个 OOM 杀手,当系统过度使用它的内存时会调用它,现在已经用完了。
Linux 默认执行内存过量使用,这基本上意味着它为程序提供了比系统实际拥有更多的内存。这样做的前提是程序实际上不会使用它们要求的所有内存。但是当系统内存不足时,它已经告诉各个正在运行的进程他们有内存,所以它不能再否认了。相反,它的作用是调用 OOM 杀手。OOM 杀手基本上是找到一个内核认为可以缓解内存不足情况的进程。通常这只是使用最多内存的过程,但算法实际上比这复杂得多。

由于您已overcommit_memory设置为0(自动模式),因此内核正在执行内存过量使用。所以从你解释的行为来看,听起来系统只是在大量交换。

从这里有 2 个选项。

减少交换

您的系统内存不足,因此内核开始将内容推入交换区。如果您的系统用完交换区,则它会调用 OOM 杀手。但是,由于您还有剩余的可用交换空间,因此不会发生这种情况。

你最初的想法,手动杀死一个进程。

当您认为系统交换过多并且某些东西需要终止时,您可以手动终止进程。这可以通过内核 SysRq 触发器来完成。

内核具有所谓的“魔法 SysRq”。这是一个告诉内核执行某种紧急操作的功能。这可以是“以只读方式重新安装所有卷”、“同步所有文件系统”或“立即重新启动”之类的内容。这些选项之一也是调用 OOM 杀手。

如果您的内核启用了魔法 SysRq(内核选项CONFIG_MAGIC_SYSRQ),您可以通过两种方式执行此操作。

  1. Alt+ SysRq+f
    只需按下键盘上的这 3 个键。
  2. echo f > /proc/sysrq-trigger
    这将执行与键盘方法完全相同的任务,但以编程方式执行。

您也可以完全禁用交换,这就是我在大多数系统上所做的,正是出于这个原因。交换是有益的,因为内核将抢先交换出未使用的数据,让更多的 ram 用于缓存。但这会导致您看到的这种强制交换问题。

我个人认为最好的解决方案是某种内核选项来在强制交换时调用 OOM 杀手。基本上让抢占式交换工作,但如果内核因为内存不足而被迫将某些内容移入交换区,则调用 OOM 杀手。
不幸的是,这只是我个人的愿望。它不这样做。