这台笔记本电脑有一个SSD,因此我决定省略掉交换。在大多数情况下,此方法效果很好,但有时RAM会变短,并且计算机会变得非常缓慢并趋于冻结。如果我注意到冻结足够快,有没有办法实现直接杀死内核的“杀死最大进程”按钮?或者,因为它是一台计算机,所以当它开始冻结并拍摄最大的过程本身时,也可以使用启发式方法。
overcommit_memory
是0
,overcommit_ratio
是50
。
这台笔记本电脑有一个SSD,因此我决定省略掉交换。在大多数情况下,此方法效果很好,但有时RAM会变短,并且计算机会变得非常缓慢并趋于冻结。如果我注意到冻结足够快,有没有办法实现直接杀死内核的“杀死最大进程”按钮?或者,因为它是一台计算机,所以当它开始冻结并拍摄最大的过程本身时,也可以使用启发式方法。
overcommit_memory
是0
,overcommit_ratio
是50
。
Answers:
根据您的评论,听起来好像系统正在交换。
Linux有一个OOM杀手,当系统过量使用它的内存时调用它,现在它已经用完了。
Linux默认情况下会执行内存过量使用,这基本上意味着它为程序提供的内存比系统实际拥有的更多。这样做的前提是程序不会真正使用它们要求的所有内存。但是,当系统内存不足时,它已经告诉各个正在运行的进程它们具有内存,因此不能再拒绝它了。取而代之的是调用OOM杀手。OOM杀手基本上找到了内核认为可以缓解内存不足状况的进程。通常,这只是使用最多内存的过程,但是算法实际上要复杂得多。
由于已overcommit_memory
设置为0
(自动模式),因此内核正在执行内存过量使用。因此,从您解释的行为来看,听起来好像系统正在大量交换。
从这里有2个选项。
您的系统用完了RAM,因此内核开始将事物推入交换区域。如果您的系统用完交换,它将调用OOM杀手。但是,由于您还有剩余的自由交换空间,因此不会发生这种情况。
当您认为系统交换过多并且需要终止某些工作时,可以手动终止进程。这可以通过内核SysRq触发器来完成。
内核具有所谓的“魔术SysRq”。这是一些功能,可以告诉内核执行某种紧急操作。这可能是“以只读方式重新安装所有卷”,“同步所有文件系统”或“立即重新引导”之类的事情。这些选项之一也是调用OOM杀手。
如果您的内核启用了魔术SysRq(内核选项CONFIG_MAGIC_SYSRQ
),则可以通过两种方式执行此操作。
echo f > /proc/sysrq-trigger
您也可以完全禁用交换,这正是我在大多数系统上所做的事情,并且正是由于这个原因。交换是有好处的,因为内核将抢先交换出未使用的数据,从而将更多的RAM用于缓存。但这会导致您看到此强制交换问题。
我个人认为最好的解决方案是某种内核选项,以在强制交换时调用OOM杀手。基本上让抢先式交换起作用,但是如果内核由于没有RAM而被迫将某些东西移入交换中,则调用OOM杀手。
不幸的是,这只是我个人的愿望。它不会这样做。
top
或ps
命令连续监视内存使用情况,如果超过一定的阈值限制,则使用kill
命令终止该进程。
grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1