今天到公司后,测试报告说页面操作时报网络异常,让我排查一下。 我先去服务上使用
ps -ef | grep <服务名>
查看了一下,发现服务是存在的,然后服务调不通超时可能是服务没响应,资源不够。于是使用top
命令查询
top 5705
键盘输入shift + m
根据内存使用率降序排序,发现占用率10%左右,似乎没啥问题,然后输入shift + p
根据CPU使用率降序排序查询如下。
居然CPU高达180%,于是赶紧查看下哪个线程使用率较高
top -H -p 5705
这里看到有两个线程在84%左右,大概就是这两个线程导致的。将十进制的线程编号转换为十六进制备用:
printf "0x%x\n" 5709
printf "0x%x\n" 5710
得到的结果是
0x164d
0x164e
这个时候应该导出线程信息看下,使用命令
/data/java/bin/jstack -l -F 5705 >> jstack.log
导出线程信息,然后下载文件后搜索 0x164d
和0x164e
,发现是两个GC线程
应该是内存不够用了,于是看下内存情况,使用以下命令
/data/java/bin/jmap -dump:format=b,file=jmap.hprof 5705
导出内存快照,然后下载下来,用MAT打开 查看这几个Problem,发现里面是一个线程池中的多个线程在从A数据库导数据到B数据库,一次Load1万条数据,开的线程较多,内存吃满了。内存已经吃满了肯定没法进行了,于是降低导数据同时执行的线程数,重启服务,重新导数据。