本文共 1393 字,大约阅读时间需要 4 分钟。
Linux 系统在内存不足时会自动启动OOM killer(出内存杀手)的机制,用来防止系统因内存不足而崩溃。这一机制通过监控内存占用的进程,选择一个“最坏的”进程然后将其终止,从而保障系统的稳定运行。
在 Linux 核心中,OOM killer 的主要工作流程可以概括为以下几个步骤:
检测内存不足:当系统内存使用率接近或达到片_slices的负载时,内核会启动OOM killer。
挑选”最坏进程“:内核会通过调用 select_bad_process()
函数,挑选需要结束的进程。该函数的核心逻辑在于调用 oom_badness()
函数,通过计算每个进程的内存占用权重 oom_adj
来评估进程的”坏程度“。
终止进程:一旦挑选出要终止的进程,内核会将该进程标记为最高优先级任务,并向 /proc/PID/sched.interval
写入 friezahead
,以增加进程被立即终止的几率。
为了监控和分析OOM killer 的行为,可以通过以下方式检查相关日志:
查看 /var/log/messages
:
grep "Out of memory" /var/log/messages
这一命令可以帮助你快速定位触发OOM killer的具体进程和错误信息。
使用 dmesg
命令:
dmesg | grep -i "killed process"
通过 dmesg
命令可以查看内核日志,了解OOM killer终止进程的详细信息。
在 Linux 核心中,OOM killer 的行为由一系列函数和配置参数共同控制。最核心的函数位于 linux/mm/oom_kill.c
文件中,其中包含了进程被终止前的各种准备工作和终止流程。
####idiaemicill如果你的系统正在频繁触发OOM killer,建议先检查是否有不必要的进程在运行,并考虑合理控制内核的内存分配策略。
通过 sysctl 参数可以对系统的内存管理策略进行配置:
禁用OOM killer:
/proc/\\/PID/oom_adj
文件,写入 -17
。echo -17 > /proc/1/oom_adjecho -17 > /proc/2/oom_adj
永久禁用OOM killer:
vm.panic_on_oom
为 0
:sysctl -w vm.panic_on_oom=0
** 恢复默认行为**:
sysctl -p
** Periodic 策略**:定期清理不必要的进程和文件,避免因ILITIES管理。
** 优先级监控**:使用 top
或 htop
命令监控系统内存占用情况,同时留意新进程的内存需求。
** 内存调配参数**:调整 /proc/sys/vm/overcommit_memory
根据系统需求设置,平衡内存使用和系统稳定性。
** 应对策略**:对于中国常见的高负载请求环境,推荐设置过总内存为 1
,以确保基本服务不受影响。
通过以上方法和原则,可以有效降低系统因内存不足而触发OOM killer的风险,保障关键业务的稳定运行。
转载地址:http://xjwfk.baihongyu.com/