博客
关于我
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/

你可能感兴趣的文章
oracle零碎要点---oracle em的web访问地址忘了
查看>>
Oracle零碎要点---多表联合查询,收集数据库基本资料
查看>>
Oracle静默安装
查看>>
Oracle面试题:Oracle中truncate和delete的区别
查看>>
ThreadLocal线程内部存储类
查看>>
thinkphp 常用SQL执行语句总结
查看>>
Oracle:ORA-00911: 无效字符
查看>>
Text-to-Image with Diffusion models的巅峰之作:深入解读 DALL·E 2
查看>>
TCP基本入门-简单认识一下什么是TCP
查看>>
tableviewcell 中使用autolayout自适应高度
查看>>
Orcale表被锁
查看>>
svn访问报错500
查看>>
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
查看>>
org.apache.ibatis.type.TypeException: Could not resolve type alias 'xxxx'异常
查看>>
org.apache.poi.hssf.util.Region
查看>>
org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
查看>>
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
查看>>
org.hibernate.HibernateException: Unable to get the default Bean Validation factory
查看>>
org.hibernate.ObjectNotFoundException: No row with the given identifier exists:
查看>>
SQL-CLR 类型映射 (LINQ to SQL)
查看>>