hum*_*ace 11 linux out-of-memory
我发现当遇到内存不足的 OOM 情况时,我的 linux box UI 完全冻结了很长时间。
我已经设置了magic-sysrq-key然后使用 echo 1 | tee /proc/sys/kernel/sysrq并遇到OOM-> UI无响应情况能够按下Alt-Sysrq-f它,如dmesg日志所示导致OOM终止/终止进程并由此解决OOM情况。
我的问题是现在。为什么 linux 变得像 GUI 冻结一样无响应,但似乎没有触发相同的 OOM-Killer,我确实通过Alt-Sysrq-f组合键手动触发了它?
考虑到在 OOM“冻结”情况下,系统反应迟钝,甚至不允许及时(< 10 秒)响应击中Ctrl-Alt-F3(切换到 tty3),我不得不假设内核必须意识到它的反应迟钝,但仍然本身没有调用Alt-Sysrq-fOOM-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
Run Code Online (Sandbox Code Playgroud)
虽然据我所知,内存 cgroup 既没有激活也没有禁用 OOM(显然必须有充分的理由让 OOM_kill 激活和禁用,或者我可能无法正确解释输出,也under_oom 0有些不清楚,仍然)
没有自动调用 OOM-killer 的原因是,尽管系统在接近内存不足y时已经完全变慢并且没有响应,但实际上还没有达到内存不足的情况。
过于简化的几乎完整的 ram 包含 3 种类型的数据:
在内存不足的情况下,Linux 内核据我所知是kswapd0内核线程,为了防止数据丢失和功能丢失,不能丢弃 1. 和 2. ,但可以自由地至少暂时删除那些映射到-来自 ram 的内存文件数据,即当前未运行的表单进程。
虽然这是涉及磁盘抖动的行为,不断丢弃数据并从磁盘重新读取它,但可以被视为有帮助,因为它避免了,或者至少推迟了必要的删除/终止进程和释放 - 但也 -失去它的内存,它有一个高昂的代价:性能。
[load pages from disk to ram with code of executable of process 1]
[ run process 1 ]
[evict pages with binary of process 1 from ram]
[load pages from disk to ram with code of executable of process 2]
[ run process 2 ]
[evict pages with binary of process 2 from ram]
[load pages from disk to ram with code of executable of process 3]
[ run process 3 ]
[evict pages with binary of process 3 from ram]
....
[load pages from disk to ram with code of executable of process 1]
[ run process 1 ]
[evict pages with binary of process 1 from ram]
Run Code Online (Sandbox Code Playgroud)
显然 IO 很昂贵,而且系统很可能会变得无响应,尽管从技术上讲,它还没有完全耗尽内存。
然而,从用户的角度来看,挂起/冻结和由此产生的无响应的 UI 可能不是真正可取的,而不是简单地终止进程(例如浏览器选项卡,其内存使用可能很可能是根本原因/罪魁祸首首先。)
这就是问题表明,手动启动 OOM的Magic SysRq 键触发器似乎很棒,因为 Magic SysRq 受系统无响应的影响较小。
虽然在某些用例中,以所有(性能)成本保留进程很重要,但对于桌面,用户可能更喜欢 OOM 杀手而不是冻结的 UI。在 stackoverflow 上的这个答案中,有一个补丁声称在这种情况下可以从内存中免除干净的映射 fs 支持的文件。