这台笔记本电脑有 SSD,因此我决定省略交换。这在大多数情况下效果很好,但有时 RAM 会变得有点短,计算机会变得非常缓慢并且往往会死机。有没有办法实现“杀死最大进程”按钮,如果我注意到冻结速度足够快,该按钮可以直接进入内核?或者,因为它是一台计算机,所以当它开始冻结并拍摄最大进程本身的启发式也可以。
答案1
从您的评论来看,听起来系统只是在交换。
Linux 有一个 OOM 杀手,当系统过度使用其内存并且现已耗尽时,就会调用该杀手。
Linux 默认情况下执行内存过量使用,这基本上意味着它为程序提供了比系统实际拥有的更多的内存。它这样做的前提是程序实际上不会使用它们请求的所有内存。然而,当系统内存不足时,它已经告诉各个正在运行的进程它们有内存,所以它不能再否认了。相反,它所做的是调用 OOM 杀手。 OOM 杀手基本上会找到内核认为可以缓解内存不足情况的进程。通常这只是使用最多内存的进程,但算法实际上比这复杂得多。
由于您已overcommit_memory
设置为0
(自动模式),因此内核正在执行内存过量使用。因此,从您解释的行为来看,听起来系统只是在进行大量交换。
从这里有 2 个选项。
减少掉期
你的系统内存不足,因此内核开始将东西推入交换区。如果您的系统用完交换空间,则会调用 OOM 杀手。但是,由于您还有剩余的可用交换空间,因此这种情况不会发生。
你最初的想法是,手动杀死一个进程。
当您认为系统交换太多并且需要终止某些进程时,您可以手动终止进程。这可以通过内核 SysRq 触发器来完成。
内核有所谓的“神奇的 SysRq”。这是一个告诉内核执行某种紧急操作的功能。这可以是“以只读方式重新安装所有卷”、“同步所有文件系统”或“立即重新启动”之类的内容。这些选项之一也是调用 OOM 杀手。
如果您的内核启用了神奇的 SysRq(内核选项CONFIG_MAGIC_SYSRQ
),您可以通过两种方式执行此操作。
- Alt+ SysRq+f
只需按键盘上的这 3 个键即可。 echo f > /proc/sysrq-trigger
这将执行与键盘方法完全相同的任务,但以编程方式执行。
您也可以完全禁用交换,这就是我在大多数系统上所做的,正是出于这个原因。交换的好处是内核会抢先交换出未使用的数据,让更多的内存用于缓存。但这会导致您看到的强制交换问题。
我个人认为最好的解决方案是某种内核选项来在强制交换时调用 OOM Killer。基本上让抢占式交换起作用,但如果内核因为 RAM 不足而被迫将某些内容移至交换中,则调用 OOM 杀手。
不幸的是这只是我个人的愿望。它不这样做。