近期某一天上班一开电脑,就收到了运维警报,有两台服务CPU负载很高,同时收到一线同事反馈 系统访问速度很是慢,几乎无响应。html
一个美好的早晨,最怕什么就来什么。只好推掉其余会议,专心搞定问题。前端
登陆系统一看,后端的接口访问果真所有超时。java
从图上可看出,pid=26481的Java进程占用了385%的CPU,机器是4核8G的配置。后端
2.而后查看下是哪一个Java应用 ps -ef | grep java 运维
发现是咱们后端request服务的应用。微服务
3.获取pid后,能够查看该进程下的线程列表。 命令: ps -mp pid -o THREAD,tid,time。优化
.png)网站
这里咱们能够看出有4个线程,长时间占用较高的CPU资源。拿到一个tid=26496,printf "%x\n" tid , 转为16进制:6780spa
4.使用jstack打印线程的堆栈信息,./jstack pid | grep tid -A 30线程
从图上可看出,是因为该应用的GC异常致使CPU占用较高。
5.导出堆栈日志分析。 jstack 26481 >> jstat.out
分析导出jstat.out,查找下RUNNABLE状态的线程。
ps:这里推荐一个分析日志的网站,超级好用,能生成图形界面的分析日志。只须要将生产的日志上传。Java Thread Dump Analyzer https://fastthread.io/
最终发现是Excel大量导出的问题。用户导出一年的财务报表,差很少近60万条数据,因为系统导出较慢,而后进行了屡次点击下载,致使应用内存不足,频繁GC, 致使CPU超高,系统假死。
至此问题发现,解决问题就变得简单了。
原文出处:https://www.cnblogs.com/lanxuan826/p/11074848.html