我发现当遇到内存不足的 OOM 情况时,我的 linux box UI 会在很长一段时间内完全冻结。
我已经设置了magic-sysrq-key,然后使用 echo 1 | tee /proc/sys/kernel/sysrq
并遇到OOM-> UI-unresponsive情况能够按下日志显示Alt-Sysrq-f
导致dmesg
OOM终止/终止进程并由此解决OOM情况。
我的问题是现在。为什么 linux 变得像 GUI 冻结一样无响应,但似乎没有触发相同的 OOM-Killer,我确实通过Alt-Sysrq-f
组合键手动触发了它?
考虑到在OOM“冻结”情况下系统反应迟钝,甚至不允许及时(< 10秒)响应命中Ctrl-Alt-F3
(切换到tty3),我不得不假设内核必须意识到它的无响应,但仍然本身并没有调用Alt-Sysrq-f
OOM-Killer ,为什么?
这些设置可能会对所描述的行为产生影响。
$> mount | grep memory
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
$> cat /sys/fs/cgroup/memory/memory.oom_control
oom_kill_disable 0
under_oom 0
oom_kill 0
虽然据我了解,内存 cgroup 没有激活或禁用 OOM(显然必须有充分的理由让 OOM_kill 激活和禁用,或者我无法正确解释输出,也under_oom 0
有点不清楚,仍然)
没有自动调用 OOM-killer 的原因是,尽管系统在接近内存不足y时已经完全变慢并且没有响应,但实际上还没有达到内存不足的情况。
过度简化了几乎完整的 ram 包含 3 种类型的数据:
在内存不足的情况下,据我所知,linux内核是
kswapd0
内核线程,为了防止数据丢失和功能丢失,不能丢弃 1. 和 2. ,但可以至少暂时删除那些映射到-内存文件来自 ram 的数据,这些数据是当前未运行的进程。虽然这是涉及磁盘抖动的行为,但不断丢弃数据并从磁盘重新读取数据,可以被视为有帮助,因为它避免了,或者至少推迟了必要的删除/杀死进程和释放但也 -失去它的记忆,它有一个高昂的代价:性能。
显然 IO 很昂贵,并且系统可能会变得无响应,尽管从技术上讲它还没有完全耗尽内存。
然而,从用户的角度来看,挂起/冻结以及由此产生的无响应 UI 可能并不是真正可取的,而不是简单地终止进程(例如浏览器选项卡,其内存使用很可能是根本原因/罪魁祸首)首先。)
这就是问题表明手动启动 OOM 的Magic SysRq 键触发器似乎很棒的地方,因为 Magic SysRq 受系统无响应的影响较小。
虽然可能存在不惜一切代价保留进程(性能)很重要的用例,但对于桌面来说,用户可能更喜欢 OOM-killer 而不是冻结的 UI。在 stackoverflow 上的这个答案中,有一个补丁声称在这种情况下可以从内存中免除干净的映射 fs 支持的文件。
在压力测试期间,您可以查看文件 /sys/fs/cgroup/memory/memory.oom_control。
或者
您可以查看它的最后修改日期,看看它是否在最后一次锁定时发生了变化。这将告诉您它是否正在尝试完成它的工作。
那是你的问题:
如果设置为 1,则表示它处于 oom 控制之下。启用。
如果设置为 0,那么它不受 oom 控制。已禁用。