现象
cpu居高不下
数据库总连接数增加 运行连接2个,无任何压力
应用报警获取不到数据库连接
应用监控显示系统98%的时间在做业务逻辑处理
分析
执行top命令找到cpu高的应用pid 为 67725
执行 top -Hp 67725 找到线程cpu占用最大的 线程 68178
线程 68178 转换为16进制 10a52
执行 jstack 67725 |grep -A 10 10a52 或者 先把线程信息输入到文件里面 jstack -l 67725 > 1.txt
分析发现
"consumer_split_calc_apply_jmq1_1620617277453" #207 daemon prio=5 os_prio=0 tid=0x00007f12307e5800 nid=0x10a52 runnable [0x00007f12068d9000]
java.lang.Thread.State: RUNNABLE
at com.test.my.driver.support.sqllog.BasicFormatterImpl$FormatProcess.perform(BasicFormatterImpl.java:103)
at com.test.my.driver.support.sqllog.BasicFormatterImpl.format(BasicFormatterImpl.java:64)
at com.test.my.driver.support.sqllog.FormattedLogger.logSQL(FormattedLogger.java:30)
at com.test.my.driver.support.sqllog.LogSqlUtils.doLog(LogSqlUtils.java:78)
- locked <0x00000000c4a94c58> (a java.lang.Class for com.test.my.driver.support.sqllog.LogSqlUtils)
at com.test.my.driver.support.sqllog.LogSqlUtils.doLogElapsed(LogSqlUtils.java:68)
at com.test.my.driver.support.sqllog.LogSqlUtils.logElapsed(LogSqlUtils.java:62)
at com.test.my.driver.support.sqllog.LogSqlUtils.logElapsed(LogSqlUtils.java:57)
at com.test.my.driver.jdbc.MyStatement.logSql(MyStatement.java:2021)
说明卡在了打印日志的逻辑 经过排查发现 LogSqlUtils 打印日志为synchronized 而且是静态方法 类级别全局锁定 所以链接一直释放不了 导致上述问题
解决
去掉打印日志部分