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

你可能感兴趣的文章
php laravel请求处理管道(装饰者模式)
查看>>
ReentrantReadWriteLock读写锁底层实现、StampLock详解
查看>>
PHP mongoDB 操作
查看>>
ReentrantLock读写锁
查看>>
ReentrantLock的公平锁与非公平锁
查看>>
php mysql procedure获取多个结果集
查看>>
php mysql query 行数,PHP和MySQL:返回的行数
查看>>
php mysql session_php使用MySQL保存session会话
查看>>
PHP mysql_real_escape_string() 函数防SQL注入
查看>>
php mysql优化方法_MySQL优化常用方法
查看>>
PHP OAuth 2.0 Server
查看>>
php odbc驱动,php常用ODBC函数集(详细)
查看>>
php openssl aes ecb,php openssl_encrypt AES-128-ECB iOS
查看>>
php paypal rest api,PayPal REST API指定网络配置文件PHP
查看>>
php pcntl 多进程学习
查看>>
PHP pcntl_fork不能在web服务器中使用的变通方法
查看>>
php private ,public protected三者的区别
查看>>
php PSR规范
查看>>
php rand() 重复,array_rand()函数从另外一个数组中随机取得的一定数量的数组的元素是否会重复?...
查看>>
php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
查看>>