首先需要明確Tomcat慢查詢日志的位置及提取方式。Tomcat的慢查詢通常記錄在訪問日志(Access Log)或應用日志(如catalina.out
)中,具體取決于配置:
/var/log/tomcat/
目錄下,文件名以localhost_access_log.
開頭(如localhost_access_log.2025-09-24.txt
)。server.xml
的<Host>
標簽內添加配置,記錄請求處理時間(%D
字段,單位為毫秒):<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D"
resolveHosts="false" />
grep
或awk
篩選處理時間超過閾值的請求(如超過800毫秒):grep 'QTime:' /var/log/tomcat/localhost_access_log.*.txt | awk -F ' ' '{if ($2 > 800) print $0}'
或通過腳本自動化(如find_slow_queries.sh
):#!/bin/bash
LOGFILE="/var/log/tomcat/localhost_access_log.*.txt"
THRESHOLD=800
grep 'QTime:' "$LOGFILE" | awk -F ' ' '{if ($2 > THRESHOLD) print $0}'
chmod +x find_slow_queries.sh
./find_slow_queries.sh
慢查詢多與數據庫操作相關,需針對性優化:
WHERE a=1 AND b=2
需創建(a,b)
索引),避免冗余索引。SELECT *
,只查詢必要字段;使用LIMIT
限制結果集大??;優先使用JOIN
替代子查詢;優化WHERE
條件(如避免函數操作字段,如WHERE DATE(create_time)=...
)。EXPLAIN
命令查看SQL執行計劃,重點關注type
列(需達到ref
或range
級別,避免ALL
全表掃描)。maxActive
(最大連接數,建議不超過數據庫最大連接數的80%)、maxIdle
(最大空閑連接數)、minIdle
(最小空閑連接數),避免頻繁創建/銷毀連接。調整Tomcat參數以提升處理能力:
-Xms
初始堆、-Xmx
最大堆,建議設置為相同值避免頻繁擴容,如-Xms2048m -Xmx2048m
);選擇合適的垃圾回收器(高并發場景推薦G1GC
,如-XX:+UseG1GC
);調整新生代與老年代比例(-XX:NewRatio=2
,新生代占堆的1/3)。server.xml
的<Connector>
標簽中調整線程參數,提升并發處理能力:maxThreads
(最大并發線程數,建議300-500)、minSpareThreads
(最小空閑線程數,建議20-50)、acceptCount
(請求隊列長度,建議100-200)。server.xml
的<Connector>
標簽中添加壓縮配置,減少數據傳輸量:<Connector port="8080"
protocol="HTTP/1.1"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,application/json"
... />
從根源減少慢查詢:
建立持續監控機制,及時發現慢查詢:
rng-tools
增大熵池:sudo apt-get install rng-tools
sudo rngd start
java.security
文件(路徑如/usr/local/jdk1.8.0_XXX/jre/lib/security/java.security
),將securerandom.source
從/dev/random
改為/dev/./urandom
,提升隨機數生成效率:sudo sed -i 's/securerandom.source=file:/dev/random/securerandom.source=file:/dev/./urandom/' /usr/local/jdk1.8.0_XXX/jre/lib/security/java.security
通過以上步驟,可系統性解決Ubuntu Tomcat日志中的慢查詢問題,提升應用響應速度與穩定性。優化過程中需結合實際場景(如應用類型、數據量、并發量)調整參數,避免盲目優化。