手把手教你定位线上CPU告警定位分析过程

447 阅读2分钟

标题1.原因分析:线上cpu告警使用率过高

在这里插入图片描述

分析过程:

标题1.首先定位是否是线程池参数配置问题

经过修改最大线程数以及各种参数发现运行模型性,cpu从10%反而一直稳定在30%,说明参数配置过小可能会导致处理异步任务过慢,线程资源持续消耗

标题2.发现代码中有手动System.gc()操作,因为这样会导致主动触发full gc,触发full gc()会使服务触发STW,同时会导致服务卡顿

2.由于触发full gc,会产生大量gc线程,所以会导致cpu使用率快速上升
在这里插入图片描述

通过监控major gc 发现,cpu飙升时间和发生major gc()时间相同,所以可以判断cpu飙升原因应该是由垃圾回收导致

JVM线程数
在这里插入图片描述

GC次数
在这里插入图片描述

标题3.解决措施

1.首先删除代码中System.gc()操作,禁止手动触发
2.找到代码中产生的大对象,因为大对象会直接跳过年轻代,进入老年代,如果老年代满了,会直接触发full gc使程序卡顿,cpu使用率升高
3.应该调大进入老年代的大对象最大参数值或者增加老年代的大小

-Xmx3550m -Xms3550m -Xmn2g -Xss1M -XX:MetaspaceSize=512M -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
设置此选项后,并行收集器自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时该间或者收集频率,该值建议使用并行收集器时,并且一直打开。

标题4.定位cpu飙升一般方法

1.top -Hp 进程号 查看java线程

2.执行 printf ‘%x’ 进程号 查看16 进制id ,用于dump信息查询结果

3.jstack 进程号 | grep -A 20 16进制id