OOM 终结者
概念所有 Linux 发行版
OOM(内存溢出)终结者是 Linux 内核的一个组件,当系统内存耗尽且无法释放时,它会终止一个进程。它根据 OOM 分数来选择进程,通常选择内存占用最多的进程。内核日志会记录每一次 OOM 终止。
1如何选择受害者
每个进程在 /proc/<pid>/oom_score 中都有一个分数,该分数会随着内存使用量的增加而增长。/proc/<pid>/oom_score_adj 的取值范围为 -1000 到 1000,用于调整该分数;-1000 意味着该进程永远不会被选中。
2查找 OOM 终止
内核会在其日志中写入 'Out of memory: Killed process'。使用 journalctl -k | grep -i oom 或 dmesg | grep -i oom 可以显示这些消息,以及进程名称及其内存占用。
3预防
增加内存或交换分区、限制高内存消耗的服务,或使用诸如 MemoryMax= 等 systemd 选项为每个服务设置限制。某些发行版还运行 systemd-oomd,它根据内存压力更早地采取行动。
如何调查 OOM 终止
- 搜索内核日志:
journalctl -k | grep -i -A5 'out of memory' - 记录被终止的进程及其内存大小。
- 检查当前的内存和交换分区:
free -h - 查找占用内存最多的进程:
ps aux --sort=-rss | head - 添加交换分区或限制服务,然后观察是否再次发生。
注意事项
- 将许多进程的 oom_score_adj 设置为 -1000 可能会导致内核没有安全的备选进程。
- 在不了解内存过量使用保护机制的情况下将其关闭,可能会导致其他地方出现故障。
相关文章
- Linux 上的交换空间什么是交换空间、如何使用 free 和 swapon 查看它、如何添加交换文件,以及 vm.swappiness 的更改内容。
- 平均负载这三个平均负载数字的含义、它们与 CPU 核心数的关系,以及负载过高时代表的问题。
- journalctl 与 systemd 日志如何使用 journalctl 读取日志、检查日志占用的空间大小,并通过 --vacuum 选项安全地缩减日志大小。
资料来源
- proc(5) 手册页:oom_score 和 oom_score_adj man7.org
- 内存溢出管理 (kernel.org) kernel.org
说明: RainServer 为 Linux 服务器提供监控和安全清理功能;它会显示将要发生的变化并事先征求确认。
最后审核: