世事洞明皆学问,人情练达即文章。这篇文章主要讲述Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child相关的知识,希望能为你提供帮助。
Linux有一个特性Linux有一个特性:OOM Killer,一个保护机制,用于避免在??内存??不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。
dmesg | grep java
Out of memory: Kill process 29650 (java) score 174 or sacrifice child
[105744155.799430] Killed process 29650 (java) total-vm:5983924kB, anon-rss:1436948kB, file-rss:0kB, shmem-rss:0kB
??linux??下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。
原因分析??内存??不足,自动查杀了进程,即杀死了项目进程,项目不能启动
这个问题的原因是low memory耗尽。“内核使用low memory来跟踪所有的内存分配,一旦low memory耗尽,就会查杀进程,以保持系统的正常运转。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉
当然,如果触发了OOM机制,系统会杀掉某些进程,那么什么进程会被处理掉呢?kernel提供给用户态的/proc下的一些参数:
1./proc/[pid]/oom_adj,该pid进程被oom killer杀掉的权重,介于 [-17,15](具体具体权重的范围需要查看内核确认)之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。
通过2个步骤可以确认,具体权重的范围:
①uname -a查看Linux内核版本
②进入/usr/src/kernels/内核版本/include/linux/oom.h确认具体的权重范围
【Linux中(Out of memory: Kill process 29650 (java) score 174 or sacrifice child)】2./proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算(2?,n就是oom_adj的值)后的结果。
oom_adj,oom_score是oom_killer的主要参考值
解决方案(我们能做什么):1.保护我们重要的进程,避免被处理掉实例:
(获得重要进程的PID)
ps -ef|grep java
(输入-17,禁止被OOM机制处理)
echo -17 > /proc/PID/oom_score_adj
2.关闭OOM机制(不推荐,如果不启动OOM机制,内存使用过大,会让系统产生很多异常数据)echo "vm.panic_on_oom=1" > > /etc/sysctl.confsystcl -p
vm.panic_on_oom 默认为0开启 为1时表示关闭此功能
等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。
当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/< PID> /oom_score,分值越高越容易被kill掉。
推荐阅读
- Kafka 负载均衡在 vivo 的落地实践
- RK3568开发笔记(RK3568虚拟机基础环境搭建之更新源安装网络工具串口调试网络连接文件传输安装vscode和samba共享服务)
- 使用luks2对ceph rbd进行加密
- #yyds干货盘点# js学习笔记五十BFC规范
- 虚拟机数据恢复FreeNAS+ESXi数据恢复案例
- 经验分享Django开发中常用到的数据库操作总结
- #yyds干货盘点# 解决剑指offer(构建乘积数组)
- png图片怎么转换成jpg(一学就会的格式转换方法,快来看看!)
- #yyds干货盘点# leetcode算法题(有效的括号)