Linux OOM机制详解

Linux OOM机制说明

在工作过程中,你可能会遇到过这种情况,程序在运行一段时间之后突然挂掉,在你保证程序在正常情况下不会挂掉的情况下,程序挂掉的原因可能是在你的程序运行过程中,有一段时间你的程序运行内存过大,而此时系统物理内存不足,导致系统触发OOM killer机制,将该进程kill。

1、OOM killer机制

OOM killer是out-of-memory killer的缩写,它是机Liux内核的一种内存管理机制。在Linux系统内存将要用完的情况下,OOM-killer进程会遍历当前机器上的所有进程,按照**进程所占内存的大小和用户打分(oom_score_adj)**对进程进行打分(占用内存越大,分数越高),然后挑选出分数最高的进程将其kill掉。

2、寻找系统中最先被OOM kill的进程

一个进程的OOM-killer打分分别由系统得分和用户打分综合评判,它的具体策略是系统打分+用户打分为当前进程的最后分数。对于Linux中运行的每一个进程,都会有两个文件分别为/proc/{pid}/oom_score和/proc/{pid}/oom_score_adj来保存系统打分和用户打分。

  • oom_score:系统打分是根据当前进程当前时间占用内存计算,占用内存越多,分数越高。
    -oom_score_adj:用户打分为用户写入,范围是-1000~1000。若进制OOM kill掉当前进程,可以将该进程的oom_score_adj设置为-1000。

所以我们可以通过Linux中进程运行过程中保存的oom_score和oom_score_adj文件,来找到最先被系统oom-kill的进程。可使用下面脚本来搜索优先被OOM_kill的进程

dir=`ls -l /proc |awk '/^d/ {print $NF}'`
result_process=0
result_score=0

for i in $dir
do
	oom_score=0
	oom_score_adj=0

	if [ -f "/proc/$i/oom_score" ]
		then
			oom_score=`cat /proc/$i/oom_score`
	fi

	if [ -f "/proc/$i/oom_score_adj" ]
		then
			oom_score_adj=`cat /proc/$i/oom_score_adj`
	fi

	process_score=`expr $oom_score + $oom_score_adj`

	if [ $i != "1" ] && [ $process_score -gt $result_score ]
		then
			result_score=$process_score
			result_process=$i
	fi
done

echo $result_process,$result_score

3、关闭OOM killer机制&避免进程被OOM kill

当我们机器上运行着重要的程序时,比如mysql或者redis等,这些程序都是比较吃内存的,所以我们不希望这些进程被系统kill掉,我们可以通过两种方式来达到目的。

1、手从修改进程oom_score_adj的值为-1000避免该进程被kill。
2、禁止的OOM kill机制,当系统发生 oom 的时候打开 kernel panic,此时系统会发生重启。

禁止OOM killer机制可通过以下方式修改/etc/sysctl.conf文件实现,
注意:在线上环境一定不要这样做,发生kernel panic的时候会导致系统重启,该系统上所有服务处于不可用状态

# 修改sysctl.conf文件
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
# 使配置生效
systcl -p

参考:
https://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/
http://linuxperf.com/?p=102

猜你喜欢

转载自blog.csdn.net/u014630623/article/details/88939100
今日推荐