为什么 linux 内存不足 (OOM) 杀手不会自动运行,而是对 sysrq-key 起作用?

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有些不清楚,仍然)

hum*_*ace 6

没有自动调用 OOM-killer 的原因是,尽管系统在接近内存不足y时已经完全变慢并且没有响应,但实际上还没有达到内存不足的情况。

过于简化的几乎完整的 ram 包含 3 种类型的数据:

  1. 内核数据,这是必不可少的
  2. 基本流程数据的页面(例如,该流程仅在 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 支持的文件。