这部分内容属于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)k