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減少數據庫訪問)。