博客
关于我
Linux 下的 OOM Killer理解和配置
阅读量:173 次
发布时间:2019-02-28

本文共 1667 字,大约阅读时间需要 5 分钟。

Tomcat、Mysql等服务进程无故被杀掉的核心原因是OOM(内存不足)问题。最近有位VPS客户抱怨MySQL无缘无故挂掉,还有位客户抱怨VPS经常死机,登陆到终端查看后发现都是常见的Out of memory问题。这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,进而触发Linux内核里的OOM killer,杀掉某个进程以腾出内存。检查相关的日志文件(/var/log/messages)会看到类似的出错信息。

OOM问题的基本概念

Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但并未实际全部使用,内核为了提高性能,会留作缓冲内存。这种过度分配内存的方式实际上是为了让系统能够更有效地利用内存。当大多数应用程序的内存需求超过了物理内存和swap的总容量时,内核必须杀掉一些进程才能腾出空间。这与银行的例子类似:当所有人同时取钱时,银行没有足够的存款应付。

OOM killer的内核机制

内核检测到系统内存不足时,会通过oom_badness()函数挑选一个最不合适的进程杀掉。这个函数根据进程的内存占用量和其他因素来计算一个“坏分数”(badness score),进程分数越高,被杀的可能性就越大。重要进程(如root进程)通常会得到一个3%的分数优惠,不容易被杀掉。用户可以通过调整oom_score_adj参数来优化进程的分数。

配置OOM killer

我们可以通过一些内核参数来调整OOM killer的行为,避免系统不停地杀进程。例如,可以设置vm.panic_on_oom=1,触发kernel panic,10秒后自动重启系统:

# sysctl -w vm.panic_on_oom=1# sysctl -w kernel.panic=10# echo "vm.panic_on_oom=1" > /etc/sysctl.conf# echo "kernel.panic=10" > /etc/sysctl.conf

此外,用户可以通过调整进程的oom_score_adj参数来优化其被杀的风险。例如,对于运行MySQL的进程,可以执行以下命令:

# ps aux | grep mysqld# echo -15 > /proc/2196/oom_score_adj

找出最有可能被OOM Killer杀掉的进程

为了找出系统中最有可能被OOM Killer杀掉的进程,可以使用以下bash脚本:

#!/bin/bashfor proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do    printf "%2d %5d %s\n" \        "$(cat $proc/oom_score)" \        "$(basename $proc)" \        "$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"done 2>/dev/null | sort -nr | head -n 10# chmod +x oomscore.sh# ./oomscore.sh

Tomcat进程被杀掉的案例

Tomcat服务器突然挂掉时,查看catalina.out没有发现错误信息。查看/var/log/messages发现内存不足系统杀死了Tomcat进程:

kernel: Out of memory: Kill process 15983 (java) score 149 or sacrifice child

总结

OOM问题是导致Tomcat、MySQL等服务进程无故被杀掉的主要原因。通过调整内核参数和优化进程的oom_score_adj,可以有效减少被OOM Killer杀掉的风险。建议增加内存、优化应用程序内存使用以及关闭不必要的进程来解决OOM问题。此外,设置vm.panic_on_oom=1可以帮助快速发现内存问题并采取措施。

转载地址:http://srxj.baihongyu.com/

你可能感兴趣的文章
python中enumerate、变量类型转换
查看>>
python中execute是啥_python – 为什么“c.execute(…)”打破循环?
查看>>
python中exit和break区别_Python中exit()和sys.exit()之间的区别
查看>>
python中h5的用法
查看>>
python中http协议编程_HTTP编程
查看>>
python中if的效率_python中关于if-else使用性能的一点感悟
查看>>
python中import os_Python:相对导入与绝对导入(import)、os.path、__file__
查看>>
python中is和==操作符
查看>>
Python中range对象的使用以及打印九九乘法表
查看>>
Python中set.discard和set.remove方法之间的运行时差异?
查看>>
python中tkinter中value_输入字段中的python Tkinter get()值
查看>>
Python中wx.FlexGridSizer
查看>>
Python中xPath技术和BeautifulSoup的使用
查看>>
python中yield的用法详解——最简单,最清晰的解释
查看>>
python中‘set.intersection()‘的算法是什么?
查看>>
Python中一个图形中的多个绘图
查看>>
python中一个好的持久同步队列
查看>>
Python中不准确的对数
查看>>
python中什么是实例方法_在Python中创建实例方法对象的不同方法
查看>>
Python中使用cutecharts实现简单的手绘风格的图表
查看>>