1. 收集关键日志文件
Tomcat的性能日志主要分布在<TOMCAT_HOME>/logs目录下,核心日志文件及作用如下:
2. 分析访问日志识别性能热点
访问日志(默认格式:%h %l %u %t "%r" %s %b %D)中的%D(请求处理时间,毫秒)和%r(请求行,含URL、方法)是性能分析的关键指标。通过以下方式定位性能瓶颈:
awk筛选%D超过阈值(如200ms)的请求,例如:awk '$10 > 200 {print $0}' access_log,找出响应慢的URL或接口;sort | uniq -c | sort -nr统计请求频率,识别被频繁访问的资源(如某个静态文件或API),判断是否因流量过大导致性能下降;3. 检查错误日志定位潜在问题
错误日志(catalina.out或localhost.<date>.log)中的异常信息能直接反映性能问题的根源,需重点关注:
OutOfMemoryError(内存泄漏)、SQLException(数据库连接失败)、ThreadDeadlock(线程死锁)等,例如OutOfMemoryError: Java heap space表明JVM堆内存不足;NullPointerException的堆栈会显示具体触发位置(如某Servlet的doGet方法),帮助快速修复代码bug;SQLException),若频率过高可能影响系统稳定性,需优先解决。4. 分析线程日志识别并发瓶颈
线程日志记录了Tomcat线程的状态(如RUNNABLE运行、BLOCKED阻塞、WAITING等待),通过线程转储(Thread Dump)分析线程使用情况:
jstack <pid>命令(<pid>为Tomcat进程ID)或Tomcat管理界面的“Thread Dump”功能生成转储文件;maxThreads(配置文件中<Connector>标签的参数,如200)与当前活跃线程数,若活跃线程接近maxThreads,说明线程池饱和,需增加maxThreads或优化请求处理逻辑;BLOCKED的线程,分析其等待的资源(如锁、数据库连接),例如多个线程等待同一个数据库连接池的连接,说明连接池大小不足;jstack输出的“Found one Java-level deadlock”信息定位死锁线程,解决循环等待问题。5. 结合JMX/监控工具监控系统指标
Tomcat的性能不仅取决于日志,还需结合系统级指标综合判断,常用工具包括:
jconsole、VisualVM等工具监控JVM内存(堆内存使用率、GC次数/时间)、线程(总数、活跃数)、连接器(请求队列长度、当前连接数)等指标;6. 调整日志配置减少性能开销
日志记录本身会消耗系统资源(如I/O、CPU、内存),需合理配置以平衡可维护性与性能:
WARN或ERROR(修改conf/logging.properties文件,如org.apache.catalina.level = WARN),减少INFO、DEBUG级别的冗余日志输出;AsyncFileHandler),将日志写入操作放入单独线程,减少对主线程的阻塞,提升系统响应速度;logrotate工具自动轮转日志文件(如每天生成一个新文件、压缩旧文件、保留30天),防止日志文件过大占用磁盘空间,影响系统性能。