Linux OOM 自动杀死进程
问题描述:
今天上班后,登录一台内网测试服务器,发现部分进程失踪 (Nginx/PHP-FPM/MySQL/Crond)。
解决方法:
1、首先启动这些进程,保证正常提供服务。
2、查看服务器日志信息,排除故障。
shell > less /var/log/messages-20160905 Sep 3 05:31:10 localdomain kernel: Out of memory: Kill process 3145 (mysqld) score 33 or sacrifice child Sep 3 05:31:10 localdomain kernel: Killed process 3145, UID 804, (mysqld) total-vm:9170936kB, anon-rss:246880kB, file-rss:32kB Sep 3 05:40:41 localdomain kernel: Out of memory: Kill process 20889 (nginx) score 2 or sacrifice child Sep 3 05:40:41 localdomain kernel: Killed process 20889, UID 803, (nginx) total-vm:130256kB, anon-rss:216kB, file-rss:12kB
3、发现类似的日志信息,上网查资料。
4、资料显示,这是由于系统内存不足导致触发 Linux Kernel OOM(Out of memory killer)保护机制,将占用内存大的进程杀死,以保证系统正常运行。
Sep 3 05:37:10 localdomain kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 Sep 3 05:37:10 localdomain kernel: mysqld cpuset=/ mems_allowed=0-1 Sep 3 05:39:30 localdomain kernel: crond invoked oom-killer: gfp_mask=0x84d0, order=0, oom_adj=0, oom_score_adj=0 Sep 3 05:40:26 localdomain kernel: crond cpuset=/ mems_allowed=0-1 Sep 3 05:40:36 localdomain kernel: php invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 Sep 3 05:40:37 localdomain kernel: php cpuset=/ mems_allowed=0-1
5、还发现一种情况,内存够用,但还是触发了 OOM 杀死进程。这里涉及到一个 Low Memory 的知识点。内核使用 Low Memory 来跟踪所有的内存分配。
注意:只有在 32 位操作系统中才区分 Low Memory 与 High Memory ,64 位系统中 Low Memory 就是所有内存空间。
shell > free -lm total used free shared buffers cached Mem: 11901 1039 10861 0 47 133 Low: 11901 1039 10861 High: 0 0 0 -/+ buffers/cache: 858 11042 Swap: 8191 2 8189
# 可以看到:Low 大小跟总内存一样大,High 都为 0 。
6、那该怎么办?
> 增加内存、使用 64 位操作系统。
> 合理配置内存空间,例如 PHP 加速器的缓存空间等,定期重启 PHP-FPM 进程。
> 手动释放内存:sync; echo 3 > /proc/sys/vm/drop_caches
> 使用 hugemem 内核,该内核以不同的方式分割 low/high memory ,而且多数情况下会提供足够多的 low memory 到 high memory 的映射。
安装 hugemem kernel rpm 包,重启服务器即可。
> 指定不杀死某进程:echo -17 > /proc/$(pidof mysqld)/oom_adj # -17 为对该进程禁止使用 OOM
> echo "vm.panic_on_oom = 1" >> /etc/sysctl.conf; sysctl -p # 关闭 OOM ( 后两三种慎用吧 )
sync; echo 3 > /proc/sys/vm/drop_caches
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用