记一次服务CPU过高排查

记一次服务CPU过高排查

今天到公司后,测试报告说页面操作时报网络异常,让我排查一下。
我先去服务上使用

ps -ef | grep <服务名>

查看了一下,发现服务是存在的,然后服务调不通超时可能是服务没响应,资源不够。于是使用top 命令查询

top 5705

键盘输入shift + m根据内存使用率降序排序,发现占用率10%左右,似乎没啥问题,然后输入shift + p根据CPU使用率降序排序查询如下。
在这里插入图片描述
居然CPU高达180%,于是赶紧查看下哪个线程使用率较高

top -H -p 5705

记一次服务CPU过高排查_第1张图片
这里看到有两个线程在84%左右,大概就是这两个线程导致的。将十进制的线程编号转换为十六进制备用:

printf "0x%x\n" 5709
printf "0x%x\n" 5710

得到的结果是

0x164d
0x164e

这个时候应该导出线程信息看下,使用命令

/data/java/bin/jstack -l -F 5705 >> jstack.log

导出线程信息,然后下载文件后搜索 0x164d0x164e,发现是两个GC线程
记一次服务CPU过高排查_第2张图片
应该是内存不够用了,于是看下内存情况,使用以下命令

/data/java/bin/jmap -dump:format=b,file=jmap.hprof 5705

导出内存快照,然后下载下来,用MAT打开
记一次服务CPU过高排查_第3张图片
查看这几个Problem,发现里面是一个线程池中的多个线程在从A数据库导数据到B数据库,一次Load1万条数据,开的线程较多,内存吃满了。内存已经吃满了肯定没法进行了,于是降低导数据同时执行的线程数,重启服务,重新导数据。

你可能感兴趣的:(jvm,JAVA,Spring,Cloud,java,jvm,开发语言)