日志是Tomcat调优的核心工具之一,通过分析访问日志、错误日志、线程日志、GC日志等,可精准定位性能瓶颈(如响应慢、线程阻塞、内存泄漏等),进而调整配置参数。以下是具体步骤和方法:
Tomcat的日志默认存储在$CATALINA_HOME/logs目录下,主要包括以下类型:
access_log.*):记录所有HTTP请求的详细信息(客户端IP、请求URL、响应状态码、处理时间等);catalina.out、localhost.log):记录Tomcat运行时的错误、警告及应用层异常(如NullPointerException、数据库连接失败);常用日志管理命令(CentOS环境):
tail -f $CATALINA_HOME/logs/access_log;ERROR关键字):grep "ERROR" $CATALINA_HOME/logs/catalina.out;sed -n '/2025-10-01/,/2025-10-07/p' $CATALINA_HOME/logs/catalina.out > /tmp/tomcat_error_202510.txt;journalctl查看Systemd管理的Tomcat日志(若Tomcat以Systemd服务运行):journalctl -u tomcat.service -f。访问日志的关键指标包括响应时间、请求量(QPS)、资源类型(如静态资源、动态接口)。通过分析这些指标,可识别以下问题:
server.xml中的maxThreads,默认200,可根据服务器配置调整至500-1000);示例命令(统计每秒请求数):
awk '{print $4}' $CATALINA_HOME/logs/access_log | cut -d: -f2 | uniq -c
该命令可统计每秒的请求数,识别高并发时段。
错误日志中的高频错误类型可提示调优方向:
OutOfMemoryError):需调整JVM堆内存参数(catalina.sh中的JAVA_OPTS),如增加初始堆大小(-Xms)和最大堆大小(-Xmx)(例如-Xms1024m -Xmx2048m);context.xml中的maxTotal、maxIdle、maxWaitMillis),例如将maxTotal从100调整至200,maxWaitMillis从10000调整至5000(减少等待时间);线程日志可通过配置server.xml开启(在<Connector>标签中添加enableLookups="false"和maxThreads="500"),或通过jstack命令手动生成(jstack -l <Tomcat进程ID> > thread_dump.txt)。分析线程日志的关键指标:
maxThreads;synchronized块使用不当),可通过优化代码或使用并发工具(如ReentrantLock)解决;jstack分析死锁线程,解除循环等待(如调整锁的获取顺序)。GC日志需在catalina.sh中开启(添加-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/tomcat_gc.log),通过分析GC日志可诊断内存问题:
-Xmx(最大堆内存)或调整新生代与老年代的比例(-XX:NewRatio,默认2,可调整为1);-XX:+UseG1GC),减少停顿时间;jmap(jmap -histo:<Tomcat进程ID>)分析堆内存中的对象分布,定位泄漏对象(如缓存未清理、静态集合持有对象引用)。Tomcat启动时,Session ID通过SecureRandom生成,若系统熵不足(/proc/sys/kernel/random/entropy_avail值低于1000),会导致生成缓慢(如耗时几十秒),进而延迟启动。解决方法:
yum install rng-tools -y,然后启动服务:systemctl start rngd;$JAVA_HOME/jre/lib/security/java.security,将securerandom.source=file:/dev/random改为securerandom.source=file:/dev/urandom;$CATALINA_HOME/bin/catalina.sh中添加:if [[ "$JAVA_OPTS" != *"-Djava.security.egd=*" ]]; then
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
fi
该配置可避免Tomcat启动时等待熵池填充,显著缩短启动时间。通过以上日志分析方法,可全面识别Tomcat的性能瓶颈,并针对性调整配置(如线程池、JVM内存、连接池、GC算法等),提升Tomcat的运行效率和稳定性。