记一次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 <pid> 堆栈快照 与 jhat -J-Xmx512m heap.bin 在localhost:7000 中查询引用,发现大对象为原始订单;
3、根据日志和相关业务人员讨论、代码定位,是因为原始订单表数量激增,相关查询sql未能及时优化,查询到的大对象无法及时回收;

结论

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。