线上环境CPU使用率飙升300%问题分析定位

329 阅读1分钟

问题描述

现象PRE T-node3节点, CPU使用率超过300%。

问题排查步骤

  1. jstack 快照

进入docker docker exec -it a4696a3180d9 bash

生成线程快照 jstack 1 >jstack20230216_1.log

排查CPU飙升问题步骤:
(1) top
(2) top -Hp [pid]
(3) 获取cpu最高的进程号并转换为16进制<pid_16>
(4) jstack [pid]|grep -A 10 [pid_16]
(5) 查看对应问题的代码

排查发现引起CPU飙升的线程都是GC线程,

image.png

  1. 查看gc日志,如果jvm参数里面加了gc log日志, 用easygc工具简单分析一下

image.png

image.png

  1. jmap 生成内存的快照

jmap -dump:live,format=b,file=heapdump20230216.bin 1

  1. MAT 快照分析

image.png

存在一个机器故障数据记录表导出,导致的。根本原因是机端上报的数据量激增,之前约定保留3天的数据量已经超过800w,导致内存空间打满,GC释放不到导致整个程序的卡死。

  1. arthas

docker exec -it a4696a3180d9 bash -c "java -jar /opt/arthas/arthas-boot.jar" T-node3 节点arthas命令进入

结论

防御性编程,对于数据导出需要预估数据量的大小,一次性全量导出是一个很危险的动作,比如其他系统异常导致数据量激增,然后导出导致内存占满不能释放,占用堆内存老年代空间,gc线程一直回收但是不能释放。

参考文档

(163条消息) 《JVM调优》- Jstack指令详解_jstack命令详解_哦灬吼吼吼的博客-CSDN博客