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

你可能感兴趣的文章
Objective-C实现bailey borwein plouffe算法(附完整源码)
查看>>
Objective-C实现balanced parentheses平衡括号表达式算法(附完整源码)
查看>>
Objective-C实现base64加密和base64解密算法(附完整源码)
查看>>
Objective-C实现base64加解密(附完整源码)
查看>>
Objective-C实现base64编码 (附完整源码)
查看>>
Objective-C实现base85 编码算法(附完整源码)
查看>>
Objective-C实现basic graphs基本图算法(附完整源码)
查看>>
Objective-C实现BCC校验计算(附完整源码)
查看>>
Objective-C实现bead sort珠排序算法(附完整源码)
查看>>
Objective-C实现BeadSort珠排序算法(附完整源码)
查看>>
Objective-C实现bellman ford贝尔曼福特算法(附完整源码)
查看>>
Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
查看>>
Objective-C实现bellman-ford贝尔曼-福特算法(附完整源码)
查看>>
Objective-C实现bellmanFord贝尔曼-福特算法(附完整源码)
查看>>
Objective-C实现BellmanFord贝尔曼-福特算法(附完整源码)
查看>>
Objective-C实现bezier curve贝塞尔曲线算法(附完整源码)
查看>>
Objective-C实现bfs 最短路径算法(附完整源码)
查看>>
Objective-C实现BF算法 (附完整源码)
查看>>
Objective-C实现Bilateral Filter双边滤波器算法(附完整源码)
查看>>
Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
查看>>