本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录。
问题描述
linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%。请求无法响应。反复重启依然同一个现象。
问题排查
1、获取进程信息
通过jdk提供的jps命令可以快速查出jvm进程,
jps pid
2、查看jstack信息
jstack pid
发现存在大量log4j线程block,处于waiting lock状态
org.apache.log4j.Category.callAppenders(org.apache.log4j.spi.LoggingEvent) @bci=12, line=201 (Compiled frame)
搜索相关信息,发现log4j 1.x版本存在死锁问题。
发现问题,于是调整log4j配置,仅打开error级别日志,重启tomcat。此时stack中block线程消失,但进程cpu占用率依然高涨。
3、进一步排查
分析每个线程的cpu占用量,此处需要引入一个大神贡献的脚本,计算java进程中,每个线程的cpu使用量。
#!/bin/bash
typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_${pid}_