首先需要明确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日志中的慢查询问题,提升应用响应速度与稳定性。优化过程中需结合实际场景(如应用类型、数据量、并发量)调整参数,避免盲目优化。