Tomcat日志中的资源消耗分析指南
Tomcat日志是诊断服务器资源消耗(如CPU、内存、磁盘I/O、线程等)的核心工具,通过系统分析日志内容及配置,可精准定位性能瓶颈并优化服务器性能。
Tomcat的主要日志文件分布在logs
目录下,不同文件记录的资源消耗信息各有侧重:
top
、htop
命令实时查看Tomcat进程的CPU使用率;分析catalina.out
中的线程堆栈(如"http-nio-8080-exec-"
线程的CPU占用),定位高CPU线程。catalina.sh
中添加-Xloggc:/var/log/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
),通过GCViewer
工具分析GC频率、持续时间及内存回收效率;catalina.out
中的OutOfMemoryError
(OOM)异常,定位内存泄漏点(如缓存未清理、大对象未释放)。catalina.out
的增长速度(过大的日志文件会增加磁盘I/O),通过logrotate
工具定期分割日志;access_log
中的静态资源请求(如图片、CSS文件),优化大文件存储(如使用CDN)或启用压缩。localhost.YYYY-MM-DD.log
中的线程状态(如"waiting for monitor entry"
表示线程阻塞);jstack <tomcat_pid>
生成thread_dump.log
),分析线程堆栈中的BLOCKED
、WAITING
状态线程,定位死锁或线程饥饿问题。catalina.out
或JMX监控连接池状态(如"HikariPool - connections: 10/10 (active/max)"
),避免连接泄漏或连接池过小导致的资源等待。grep -i "memory" catalina.out
查找内存相关日志;grep "GET" access_log | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr
统计每分钟请求数);tail -f catalina.out
监控实时错误)。catalina.sh
中的JMX参数(-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
),使用JConsole
、VisualVM
等工具远程监控Tomcat的资源使用情况(如线程池、内存、GC)。WARN
或ERROR
,减少DEBUG
级别的冗余日志(如conf/logging.properties
中修改org.apache.catalina.level = WARN
);logrotate
工具分割catalina.out
(如每天生成一个新文件),避免单个文件过大占用磁盘空间;logging.properties
中配置java.util.logging.ConsoleHandler.level = FINE
,java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
,java.util.logging.SimpleFormatter.format = [%1$tF %1$tT] [%4$-7s] %5$s %n
,减少日志记录对主线程的影响。server.xml
中的maxThreads
(默认200,可根据CPU核心数调整,如maxThreads="500"
)、minSpareThreads
(默认10,设置为50以减少线程创建开销);-Xms512m -Xmx1024m
,初始堆与最大堆一致避免频繁扩容)、选择合适的垃圾回收器(如G1GC适用于大内存应用:-XX:+UseG1GC
);server.xml
中的AJP Connector(<!-- <Connector protocol="AJP/1.3" address="::" port="8009" redirectPort="8443" /> -->
),减少不必要的端口监听。webapps
目录下的空应用),减少启动时的资源加载;SELECT *
),减少数据库访问时间;InputStream
、Connection
等资源),减少不必要的对象创建(如使用对象池复用对象),提高代码执行效率。