首页 > 编程知识 正文

linux线程分析工具,线程阻塞的原因

时间:2023-05-06 02:36:03 阅读:22611 作者:4752

本文来自网络易云社区

作者: 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种云产品!

更多的网易研发、产品、运营经验分享请进入网易云社区。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。