本文来自网络易云社区
作者: zjdsy
最近部门的某个产品周末在测试服务器下无故停机。 周一测试的同学来询问具体原因,综合周末收到的哨兵系统报警,简要分析现象,我认为是后台服务的原因。
1 .首先登录哨兵系统,确认我们部署的服务状态
在这里,内存、硬盘等指标处于比较正常的水平,但由于CPU在某个时间段非常高,所以初步判断是CPU异常导致的服务中断。 (这里有CPU状态异常图,但没有保存事故现场) ) ) )。
2 .登录服务器并检查服务器的状态
(1)查看日志
登录到部署服务的两台服务,查看部署的两台服务的日志,发现日志中报告了oom错误
)2)使用top命令
使用top命令,还可以看到本服务的CPU占有率将发生井喷
省略图示,该服务的CPU占有率为99%
结论:它被定位为内存溢出问题,时间点也符合服务中断的时间。 此时,应该查找具体是什么原因导致oom发生的
3.dump内存文件
部署项目时,必须添加名为- xx : heapdumponoutofmemoryerror的参数。 等待OOM时dump内存文件
此时,我们发现内存文件是在设置的路径下生成的
使用java visualVM分析内存文件
)1)使用scp命令本地下载此内存文件。 省略具体操作
)2)打开java visualVM虚拟机APP应用程序
因为我使用的是mac系统,所以不熟悉的伙伴可能不知道存在的地方,这里也试着写一下jdk拥有的工具的路径吧
/library/Java/javavirtualmachines/JDK1.8.0_ 144.JDK/contents/home/bin
)3)导入内存文件后,可以通过java visualVM查看该文件的概要
可以看到,我们的visualVM虚拟机已经向我们显示了每个线程的状态。
然后,查找处于BLOCK状态的线程
我们发现了BLOCK状态的线程。 那些指向的代码都是一样的。 MMLogger是我们封装的日志文件。 有什么问题吗?
5 .分析代码
确定具体代码问题后,接下来分析代码。 发现了两个问题
)1)在AOP中,所有条目接口都配置为打印一个日志
执行(public * com.net ease.ai.ar.dongjian.web . *.* (() ) ) ) ) ) ) )。
)2)日志使用不正确
我们在使用org.apache.log4j.LogManager;
过几天跟着代码走,就知道会进入这个方法
这些代码段都有关键字,如果并发量很大,可能会发生死锁
总之,综合这两个原因,同时有许多线程打印日志,打印日志进入synchronize代码段,许多线程等待执行此代码,从而导致阻塞
以上两个方面,我们分别解决
)1)删除所有接口中的日志配置,改为对所需接口进行日志注释的方式
)2)修改日志类,更改为org.slf4j.LoggerFactory;
网络易云免费体验馆,0成本体验20种云产品!
更多的网易研发、产品、运营经验分享请进入网易云社区。