背景
该服务主要提供给各个第三方委外渠道的应用进行查询交费操作。在非请求高峰时段,出现CPU飙升的现象,由于此前曾出现此类情况,线上保留了现场,提供排查的条件。
服务器资源
- CPU : 16核
- 内存 : 32G
项目技术架构
- SpirngBoot 2.0.1.RELEASE
- SpringJPA + Mysql
- sharding-jdbc_4.0.0-RC2 (分表框架)
负载情况
CPU 使用率
从Zabbix监控上,我们可以看到服务器CPU 从18点50分瞬间飙升,飙升后CUP使用率基本维持在80%左右。在19点17分左右,CPU再度飙升,此后CPU使用率接近100%。
内存使用率
服务器内存在18点50分左右,被吃掉了接近2G.并且没有释放的现象。
排查步骤
- 通过TOP命令查询到当前服务的【PID】,获得当前服务PID为14564, 且CPU一致被吃着。.
- 通过top -b -n 1 -Hp 【PID】 命令获取该服务的详细信息, 可以看到有10多个线程一直占用着CPU。
- 使用java虚拟机自带的堆栈跟踪工具jstack, 输出当前服务各个进程的堆栈明细。我是使用命令 jstack [-l] ,查看服务的活动线程。通过命令 jstack -l 14564 得到以下信息
执行: jstack -l 14564
"Attach Listener" #18182 daemon prio=9 os_prio=0 tid=0x00007f901c00a800 nid=0x63cb waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"http-nio-8300-exec-424" #17350 daemon prio=5 os_prio=0 tid=0x00007f8f00082800 nid=0x6455 waiting on condition [0x00007f8ec76f5000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000067494f870> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.Ab