Tomcat日志中的并发问题分析指南
Tomcat日志中的并发问题主要可分为四类,需先通过日志特征定位问题类型:
maxThreads上限)。%D字段)显著增长,或通过监控工具发现平均响应时间上升。需收集Tomcat及应用的以下日志,为分析提供基础:
catalina.out(记录标准输出/错误,含线程池、内存等系统级信息)、localhost.YYYY-MM-DD.log(记录应用级日志,含业务异常)。server.xml配置AccessLogValve生成(默认路径为logs/localhost_access_log.YYYY-MM-DD.txt),包含请求时间、响应时间、状态码等,用于分析请求分布与延迟。DEBUG或INFO级别,记录线程池状态、数据库连接获取情况等业务细节。catalina.out中出现“Thread pool exhausted”或线程池状态日志(如“Active threads: 200 (max: 200)”);访问日志中大量请求的响应时间为-1(表示未完成)。activeThreads)、最大线程数(maxThreads)及待处理任务数(queueSize),若activeThreads = maxThreads且queueSize持续增长,则说明线程池耗尽。catalina.out中出现数据库驱动的连接超报错(如“org.apache.tomcat.jdbc.pool.PoolExhaustedException”)。maxActive、maxWait),结合日志中的连接获取时间(如connectionAcquisitionTime),判断是否因连接数不足或获取超时导致。catalina.out中出现“OutOfMemoryError”(如java.lang.OutOfMemoryError: Java heap space);频繁的Full GC日志(如“Full GC (System.gc())”)。jmap工具导出堆转储(jmap -dump:format=b,file=heap.hprof <Tomcat_PID>),使用MAT(Memory Analyzer Tool)分析内存泄漏对象(如未关闭的InputStream、缓存未清理的大对象)。%D字段(请求处理时间)显著增长(如从100ms升至1s以上);catalina.out中出现慢请求警告(如“Slow query: 500ms”)。/api/order/list),检查是否因数据库查询慢、外部接口调用超时或代码逻辑问题(如循环嵌套)导致。jconsole或jvisualvm连接Tomcat,监控“Catalina:type=ThreadPool”MBean,查看活动线程数、待处理任务数等实时指标;监控“Catalina:type=Memory”MBean,查看堆内存使用情况。jstack -l <Tomcat_PID> > thread_dump.log生成线程转储文件。locked <monitor>)和等待的锁(waiting to lock <monitor>),分析阻塞链。根据分析结果采取针对性措施:
server.xml中的Executor配置,合理设置maxThreads(如根据CPU核心数×200估算)、minSpareThreads(如50)和acceptCount(如100,队列长度不宜过长)。maxActive(如200)、调整maxWait(如3000ms),开启连接泄漏检测(如removeAbandonedOnBorrow=true)。ReentrantLock替代synchronized)、使用并发集合(如ConcurrentHashMap替代HashMap)、及时关闭资源(如InputStream、Connection)。protocol="org.apache.coyote.http11.Http11NioProtocol")、引入负载均衡(如Nginx分发请求)、使用缓存(如Redis减少数据库访问)。