记一次cpu负载高的问题定位

背景

生产服务出现请求慢,接口超时,服务器cpu占用高,需要排查定位问题。

初步定位

1、根据反馈,初步定位为cpu占用高导致接口响应变慢,接下来需要定位cpu负载高的原因。
2、使用top命令可以看到java进程cpu占用过高;
3、接下来使用 top -Hp pid 查询进程内高的线程pid,发现有四个线程cpu占用在80%;

排查线程

1、使用printf "x \n" pid依次转换线程id为十六进制;
2、使用jstack pid |grep tid -A 30 依次查看cpu占用高的线程信息,发现皆为gc 线程判定为频繁fullgc或gc时间过长;

排查内存

1、输出gc信息使用jstat -gcutil pid 10000 10 ,得知一次完整的gc需要365秒,判断是有大对象需要回收;
2、接下里就是定位哪里的引用对象过多的问题,结合jmap -dump:format=b,file=heap.bin 堆栈快照 与 jhat -J-Xmx512m heap.bin 在localhost:7000 中查询引用,发现大对象为原始订单;
3、根据日志和相关业务人员讨论、代码定位,是因为原始订单表数量激增,相关查询sql未能及时优化,查询到的大对象无法及时回收;

结论

原始订单表数据增长大于预期,相关sql未能及时优化,大对象回收时间长,导致cpu占用高。

你可能感兴趣的:(记一次cpu负载高的问题定位)