背景
生产服务出现请求慢,接口超时,服务器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 -histo:live pid | head -30 发现大对象为原始订单;
3、根据日志和相关业务人员讨论、代码定位,是因为原始订单表数量激增,相关查询sql未能及时优化,查询到的大对象无法及时回收;
结论
原始订单表数据增长大于预期,相关sql未能及时优化,大对象回收时间长,导致cpu占用高。
网友评论