Java内存溢出故障案例及Linux内存机制探究

news2024/9/21 12:30:40

文章目录

    • Java内存溢出故障案例及Linux内存机制探究
    • OOM Killer触发机制分析
    • 如何避免系统触发OOM Killer

这部分内容属于demo案例分享,解决线上运维问题,思路是最重要的

Java内存溢出故障案例及Linux内存机制探究

这是一个线上数据分析应用故障案例,电话告警说分析任务失败,此数据分析程序是基于Java的,运行在一台CentOS6.x版本的操作系统上。作为一个经验丰富的运维老手,第1步是尝试是否能够远程SSH登录到系统,还好,SSH还能够远程连接。笔者首先怀疑是应用程序本身的问题,因为它在崩溃之前一点异常也没有。于是笔者查看了应用程序日志,没有错误,没有警告,也没有任何可疑的信息。看来问题好像不在程序代码上,那么就尝试从操作系统方面看看是否有可疑日志信息。果然在5min后,笔者通过执行dmesg命令的时候,发现了如下异常信息:
在这里插入图片描述

此日志对排查问题非常有用,从这里可以发现其实是Linux内核的问题,是OOM Killer(Out of memory Killer)kill了PID为30328的Java进程,而这个进程刚好是线上数据分析应用对应的进程。那么OOM Killer为什么要kill掉Java进程呢,这个要详细分析一下。

此日志对排查问题非常有用,从这里可以发现其实是Linux内核的问题,是OOM Killer(Out of memory Killer)kill了PID为30328的Java进程,而这个进程刚好是线上数据分析应用对应的进程。那么OOM Killer为什么要kill掉Java进程呢,这个要详细分析一下。要解决问题,找到关键的日志非常重要,上面第1步已经找到了异常日志,那么下面就来分析一下这些日志中都包含了哪些信息,理解了这些日志的含义,处理问题的方法也就很容易找到了。首先看到有个Out of memory关键字,很明显,这是内存溢出的标志,这通常是因为某时刻应用程序大量请求内存导致系统内存不足造成的,继而触发了Linux内核里的内存不足终结者Out of Memory(OOM)killer的内建机制。在内存过低的情况下,这个终结者会被激活,然后挑选出一个进程去终结掉,以腾出内存留给系统用,不至于让系统立刻崩溃。其实,从日志中也可以看出,是内存不够了,可以看到有Free swap=0kB的字样,另外还有oom_adj、oom_score_adj等值也均为0,这些值的含义,下面会做详细介绍。

最后,从日志中可知,此系统环境是2.6.32-431.el6.x86_64,其实是CentOS6.5x86_64版本的系统。先看看系统内存状态,从free看,可用物理内存很低,cached和buffers都比较低:
在这里插入图片描述
再观察系统message日志,跟dmesg命令获取的信息完全吻合
在这里插入图片描述
到这里为止,基本可以确定是系统内存不足,导致出现了这次故障,但是,为什么系统内存突然会占用完呢?为什么OOM Killer要kill掉这个数据分析的Java进程而不是其他进程?

OOM Killer触发机制分析

OOM Killer是Linux内核在内存不足情况下的一种管理机制,当内核检测到系统物理内存不足时,就会通过OOM Killer机制kill掉一些进程。kill进程的原则是通过使用一套启发式算法计算所有进程的分数,然后选出分数最高的那个进程kill掉。一般分数最高的进程占用的内存刚好是最大的。那么为什么会突然出现内存不足的情况呢?这就要说说进程与内存的运行机制。默认情况下,Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是实际上并没有全部使用,为了提高性能,这部分没用的内存可以留作他用。这部分内存是属于每个进程的,内核直接回收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commit memory)的办法来间接利用这部分“空闲”的内存,提高整体内存的使用效率。这个问题最类似的就是宽带运营商了,如现在电信宽带承诺卖给用户的都是300MB光纤带宽,而这实际上远远超出了他们的网络容量。他们赌的就是用户实际上并不会同时使用并用完分配的带宽上限。

一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,如果这些应用程序的内存需求加起来超出了物理内存(包括Swap)的容量,这就会导致系统可用内存迅速降低甚至不够用的情况,也就是没有内存页能够再分配给进程了。此时,内核必须kill掉一些进程才能腾出内存空间保障系统正常运行,于是,OOM Killer机制被激活了,并通过启发式算法找出了要终结的进程。

理解了这个机制之后,就很容易理解了为什么Java进程“躺着也能中枪”了,因为它在系统上一般占用内存最多,所以如果发生Out of Memeory(OOM)的话,Java进程总是不幸第1个被kill掉的应用。OOM Killer机制也是可配置的,可以通过一些内核参数来调整OOM Killer的行为,避免系统在那里不停地kill进程。kill进程是根据每个进程打分的高低来决定的,root权限的进程通常被认为很重要,不应该被轻易kill掉,所以打分的时候可以得到3%的优势。运维人员可以在用户空间通过操作每个进程的oom_adj内核参数来降低哪些进程被OOM Killer选中kill掉的概率。例如,如果不想Java进程被轻易kill掉的话,可以找到Java运行的进程号后,调整oom_score_adj的值即可

如何避免系统触发OOM Killer

通过上面的分析解读已经知道发生了什么问题,但还是搞不清楚到底是谁触发了OOM Killer。通过进一步的了解和分析,找到了答案:这个数据分析应用系统,每天定时分析的数据量在9000万左右,而故障的当天,要分析的数据量在5亿左右,数据量的陡增,导致分析程序占用大量内存,进而出现内存资源不足,所以数据量增大是导致触发OOM Killer的直接原因。

此外,查看系统/proc/sys/vm/overcommit_memory的设置

cat /proc/sys/vm/overcommit_memory

此值为1,表示用户申请内存的时候,系统不会对内存是否够用进行检查,这样,就会出现内存超过可用内存的情况,进而触发OOM Killer,这也是此次事故的另一个原因。要尽量避免OOM Killer的产生,可以设置/proc/sys/vm/overcommit_memory为0,这样,可以最大限度地避免系统触发OOM Killer。

end…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java—反射

文章目录什么是反射反射定义java创建对象的三个阶段反射过程反射第一步:获取类对象获取类对象的三种方式反射第二步:获取类信息如何获取类信息?1、获取成员变量:2、获取方法:3、获取构造器反射第三步:使用反…

vue学习笔记——简单入门总结(四)

文章目录1.Vue3的特性和变化1.1.创建vue3项目1.2.分析main.js变化:1.3.setup--组合式api的开端1.4.ref函数和reactive函数:1.5.watch监视属性1.5.watchEffect函数1.6.vue3生命周期:1.Vue3的特性和变化 1.1.创建vue3项目 1.这里我们使用脚手架…

RegAD-Registration based Few-Shot Anomaly Detection论文学习

摘要 本文为少样本异常检测(FSAD),这是一种实用但尚未被研究的异常检测(AD),少样本意味着在训练中只为每个类别提供有限数量的正常图像。 现有的少样本异常检测的研究主要使用的是 一类别一模型 学习范式…

李宏毅《DLHLP》学习笔记7 - Voice Conversion

视频链接:https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接:https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

JAVA+MySQL 图书馆借阅信息管理系统

图书馆是当下很多大学生和有志青年学习和借阅图书的场所,图书馆每天都有大量的人员需要接待,如何能够更好的对用户的这些借阅信息进行信息化的管理是当下大多数图书馆管理人员所关心的问题 本系统是通过JAVA和MYSQL来进行开发的,通过本系统可以对图书馆内的图书信息,用户信息以…

基于PCIe的NVMe协议在FPGA中实现方法

NVMe协议是工作在PCIE的最上层协议层的,故需要先搞清楚PCIE。本文基于Xilinx的UltraScale,开发工具为Vivado2021.2。学习中以spec为主,其它资料辅助参考(重点介绍学习方法及资料,有时间再加细节)。请勿转载! 1 PCIe学…

基于PHP+MySQL青年志愿者服务管理系统的设计与实现

志愿者管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的人积极的参加到志愿者行列中来,不仅为需要的人提供了服务,而且锻炼了自己,志愿者是一个对社会和自己以及需要帮助的人都有很多好处的事情 PHP青年志愿者服务网站是一个公益类型的网站,系统通过PHp:…

HK1 BOX刷入 Armbian系统作为服务器

HK1 BOX刷入 Armbian系统作为服务器 1 安装Armbian到EMMC 硬件 HK1 BOX s905 x3 固件版本选择 Armbian_23.02.0_Aml_s905x3_bullseye_5.15.80_server_2022.12.01用usb启动,tf/sd有的设备不行,有干扰,有可能从TF卡无法启动系统。 用usb启…

Grid 布局实现九宫格图片动画

前言 👏Grid 布局实现九宫格,background-position设置背景图像起始位置,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义css变量:九宫格中每个宫格的长/宽为w&#xff0c…

Kafka - 14 Kafka消费者 | 分区的分配策略及再平衡 | Range | RoundRobin | Sticky | CooperativeSticky

文章目录1. 分区的分配以及再平衡2. Range 分区分配以及再平衡3. RoundRobin 分区分配以及再平衡4. Sticky 分区分配以及再平衡1. 分区的分配以及再平衡 一个consumer group中有多个consumer组成,一个 topic有多个partition组成,现在的问题是&#xff0…

【Python自然语言处理】规则分词中正向、反向、双向最大匹配法的讲解及实战(超详细 附源码)

需要源码和字典集请点赞关注收藏后评论区留言私信~~~ 一、规则分词 规则分词核心内容是建立人工专家词典库,通过将语句切分出的单词串与专家词典库中的所有词语进行逐一匹配,匹配成功则进行对象词语切分,否则通过增加或者减少一个字继续比较…

文件或者文件夹的忽略

文件或者文件夹的忽略 编辑项目的时候,将一些临时文件或者插件可以忽略上传到项目库中去。 追踪中的文件,不能被忽略。 首先的创建.gitignore文件,并且该文件需要放到项目的根目录下 接着,打开.gitignore文件 windows中 open d…

软件测试——分类

测试分类 一、按照测试对象划分 1、界面 界面测试UI测试 (1)测试软件界面元素完整性,正确性,一致性 (2)软件界面排版布局合理、字体、颜色 (3)测试界面的自适应性,界面…

1549_AURIX_TC275_SCU系统中的CCU模块

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 从这一份笔记开始看一下SCU系统,其实这个是一个功能组合,其中的一个小模块又叫做SCU。因此,在名称上可能会有一点点绕。近段时间看相关的资料比较多&…

数据结构与算法—数组栈和链表栈

数据结构与算法—数组栈和链表栈 🌈一览众山小数据结构与算法—数组栈和链表栈栈介绍栈图解栈实现数组实现栈实现思路实现代码单链表实现栈实现思路(图解)实现代码栈总结栈力扣栈介绍 栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算…

Java—泛型、内部类、多继承

文章目录泛型1.泛型是什么,使用泛型的好处2.泛型中的限定通配符和非限定通配符3.泛型擦除内部类多继承多继承使用:———————————————————————————泛型 1.泛型是什么,使用泛型的好处 ​ 泛型就是把类型参数化&…

骰子游戏-第11届蓝桥杯Scratch选拔赛真题精选

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第94讲。 蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选…

Python源码剖析1-整数对象PyIntObject

1、PyIntObject 对象 [intobject.h] typedef struct {PyObject_HEADlong ob_ival; } PyIntObjectPyIntObject是一个不可变(immutable)对象。Python内部也大量的使用整数对象,我们在自己的代码中也会有大量的创建销毁整型对象的操作&#xff…

霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

预计阅读时间:10分钟 一、简介 霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长。 相关术语 路径:从书中一个节点…

Docker安装可视化管理器Portainer

Docker安装可视化管理器Portainer Portainer 提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm 集群和服务等集中管理和操作、登录用户管理和控制…