服务莫名被kill问题
作者:互联网
一:背景
环境经常发生服务无故挂掉的现象。针对这个现象对服务程序进行分析排查。
二:性能问题排查
1、通过Arthas分析程序
首先通过阿里开源的JVM性能分析工具Arthas检查服务相关的性能指标。通过一段时间的观察,服务内堆内存和GC都正常,其中堆内存大小在一定范围内波动发生溢出。故排除因内存溢出导致的程序异常终止情况。
2、分析hs_err_pid文件
在服务程序挂掉后,后续启动的java进程也相继失败并在/tmp目录下生成hs_err_pid_xxx.log文件。
当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致JVM crash的重要信息,我们可以通过分析该文件定位到导致JVM crash的原因,从而修复保证系统稳定。
通过分析该文件可以看出没有足够的内存运行JVM导致。
3、分析linux系统日志
通过linux系统命令dmesg查看系统命令。
从日志可以看出由于OOM导致Linux杀死了74856进程,该进程就是我们的服务。
仔细查看日志可以发现是由于swap分区为空了导致了linux系统启动OOMkill 机制。
Linux下有个特性叫做OOM killer(Out of memory),从字面的意思可以看出和内存溢出相关,当内存耗尽时,该问题就会出现。在Linux2.6.内核中,当该功能打开后,在内存耗尽时,会根据一定的值计算出一个合适的用户空间的进程给kill掉,以便释放更多的内存,保证整个系统的稳定运行。在系统的日志中通常会有下面的打印日志:Out of memory: kill process 959 (sshd) score 55 or a child。
4、优化配置
对于重要程序,不能随意被linux系统杀掉,可以修改oom_adj的值,这里的默认值为0,当我们设置为-17时,对于该进程来说,就不会触发OOM机制,被杀掉。
echo -17 > /proc/$(pidof sshd)/oom_adjecho -17 > /proc/$(pidof sshd)/oom_adj
三、Arthas使用
Arthas是一个功能强大的Java诊断工具,可以帮助解决如下的问题:
1)这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2)我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3)遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4)线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5)是否有一个全局视角来查看系统的运行状况?
6)有什么办法可以监控到JVM的实时运行状态?
7)怎么快速定位应用的热点,生成火焰图?
8)怎样直接从JVM内查找某个类的实例?
参考:
https://arthas.aliyun.com/doc/
https://blog.csdn.net/chenssy/article/details/78271744
http://blog.chinaunix.net/uid-20788636-id-4308527.html
http://www.wowotech.net/memory_management/oom.html
标签:服务,oom,Arthas,莫名,kill,内存,JVM,linux,日志 来源: https://www.cnblogs.com/zsrecord/p/16418703.html