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

你可能感兴趣的文章
PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
查看>>
PostgreSQL学习总结(2)—— PostgreSQL 语法
查看>>
PostgreSQL学习总结(3)—— PostgreSQL 数据类型
查看>>
Qt开发——圆面积计算器
查看>>
PostgreSQL学习总结(5)—— PostgreSQL table 创建与删除
查看>>
PostgreSQL学习总结(6)—— PostgreSQL 模式(SCHEMA)详解
查看>>
PostgreSQL学习总结(7)—— PostgreSQL 语句 INSERT INTO、SELECT、UPDATE、DELETE 等学习
查看>>
PostgreSQL学习总结(8)—— PostgreSQL 基于数据库和基于模式(schema)的多租户分析
查看>>
PostgreSQL学习总结(9)—— PostgreSQL 运算符与表达式
查看>>
PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
查看>>
PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
查看>>
PostgreSQL学习笔记:PostgreSQL vs MySQL
查看>>
PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
查看>>
PostgreSQL导入shape数据(地图工具篇.10)
查看>>
PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
查看>>
PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
查看>>
Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
查看>>
PostgreSQL忘记密码
查看>>
PostgreSQL数据库pg_dump命令行不输入密码的方法
查看>>
PostgreSQL新手入门
查看>>