一天的晚上,开始收到告警信息,某某系统cpu使用率超过85%,查看3天cpu使用率基本都正常在7-8%区间,以为正常的大查询造成的瞬时值,持续观察发现没有下降的趋势,后续做暴力重启没用,联系开发一并排查
堆栈信息
1. 先top实时找到最高的pid
[root@test ~]# top
top - 11:07:59 up 129 days, 1:46, 2 users, load average: 3.74, 2.80, 1.72
Tasks: 399 total, 1 running, 398 sleeping, 0 stopped, 0 zombie
%Cpu(s): 40.4 us, 4.8 sy, 0.0 ni, 54.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16265576 total, 502764 free, 10555140 used, 5207672 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 5287684 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1647 root 20 0 7186604 122428 19016 S 323.5 0.8 0:02.03 java
2. 通过进程发现为tomcat服务
[root@test ~]# ps -fe |grep 1647
root 1647 0 Sep25 ? 00:18:12 /usr/local/jdk1.8.0_152/jre/bin/java
-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027
-Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat
-Dcatalina.home=/usr/local/tomcat
-Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
3. 打印堆栈信息
[root@test ~]# jstack 1647 > 1647.log
4. 找出进程中最高的线程id
[root@test ~]# top -Hp 1647 | head -n 20
5. 将线程id转换为16进制
[root@test ~]# printf "%x\n" 4239
108f
[root@test ~]# cat 1647.log | grep 108f
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007efed8022800 nid=0x108f runnable
上述发现为gc异常
6. 实时查看gc状态(实时查询发现gc年轻代不能正常回收释放,后续发生FGC导致程序的不可用)
[root@test ~]# jstat -gcutil 1647 3000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
....
0.00 40.62 92.81 93.73 96.40 94.47 17 1.027 4 1.429 2.546
75.00 0.00 15.84 93.76 96.40 94.47 17 1.122 5 2.129 4.550
75.00 0.00 40.05 93.76 96.40 94.47 18 1.242 6 3.429 5.550
62.50 0.00 27.74 93.82 96.40 94.47 21 1.570 7 3.429 7.558
62.50 0.00 70.02 93.82 96.40 94.47 23 2.236 8 12.429 10.558
0.00 0.00 100.00 99.98 96.60 94.47 23 2.236 10 15.429 14.563
0.00 0.00 100.00 99.98 96.60 94.47 23 2.236 11 20.429 17.563
0.00 0.00 100.00 99.98 96.60 94.47 23 2.236 12 24.429 18.563
参数 | 说明 |
---|---|
S0 | 新生代 0区使用占比 |
S1 | 新生代 1区使用占比 |
E | 新生代使用占比 |
O | 老年代使用占比 |
M | 元数据使用占比 |
CCS | 压缩使用占比 |
YGC | 年轻代垃圾回收次数 |
YGCT | 年轻代垃圾回收时间(秒) |
FGC | FGC次数 |
FGCT | FGC时间(秒) |
GCT | 总垃圾回收时间(秒) |
堆快照
jmap -dump:live,format=b,file=1647.hprof 1647
然后使用工具(MemoryAnalyzer)导入文件进一步分析,工具这快不是很懂,等后续熟悉在补充