如何通过阅读这篇教程,轻松学会Ubuntu下Tomcat慢查询的优化方法?

更新于
2026-08-12 14:35:09
3阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

你在 Ubuntu 上使用 Tomcat 时往往会遇到以下痛点:

  • 不知道日志文件到底放在哪,找不到想看的慢请求。
  • 看到 QTime 字段却不清楚如何提取并判断是否真的慢。
  • 不懂如何把日志信息与数据库慢查询关联起来导致排查效率低。话说回来,
  • 缺乏一套可复用的调整清单。无法快速定位线程池、GC 或数据库索引等瓶颈。

下面的教程将一步步帮你解决这些问题,让你比较容易掌握 Ubuntu 下 Tomcat 慢查询的调整方法。

如何通过阅读这篇教程,轻松学会Ubuntu下Tomcat慢查询的优化方法?

1️⃣ 环境准备:Java 与 Tomcat 安装

安装 Java

# 更新软件源
sudo apt update
# 安装默认 JDK
sudo apt install default-jdk -y
# 验证安装
java -version

下载并解压 Tomcat

# 创建 tomcat 使用者和组
sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat tomcat
# 下载最新稳定版
cd /opt
sudo wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.23/bin/apache-tomcat-10.1.23.tar.gz
# 解压并设置权限
sudo tar xf apache-tomcat-10.1.23.tar.gz
sudo mv apache-tomcat-10.1.23 tomcat
sudo chown -R tomcat:tomcat tomcat

启动 Tomcat 并验证

# 切换到 tomcat 使用者开启服务
cd /opt/tomcat/bin
./startup.sh
# 浏览器访问 http://localhost:8080/ 确认页面正常

2️⃣ 定位访问日志文件

TOMCAT 的访问日志默认存放在:

如何通过阅读这篇教程,轻松学会Ubuntu下Tomcat慢查询的优化方法?
/var/log/tomcat/ 或者 /opt/tomcat/logs/ 

看日志目录结构示例:

# 查看目录列表
ls /var/log/tomcat | grep localhost_access_log
# 常见文件名格式: localhost_access_log.YYYY-MM-DD.txt
# QTime 字段记录每个请求的耗时

从常用命令来看。快速筛选 QTime 超过阈值的请求

# 阈值设为 800ms,可自行调整
grep 'QTime=' /var/log/tomcat/localhost_access_log.* | \
awk -F'QTime=' '{if print}'> slow_requests.log
# 查看结果示例
less slow_requests.log

再看更精准,利用 pt-query-digest 分析数据库慢查询日志

# MySQL 慢查询日志开启示例:
-- 在 my.cnf 中添加:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2 # 单位秒
# 安装 pt-query-digest 工具
sudo apt install percona-toolkit
# 分析慢查询日志并生成报告:
pt-query-digest /var/log/mysql/slow-query.log> mysql_slow_report.txt
# 查看最频繁且耗时最高的 SQL:
less mysql_slow_report.txt | grep 'Top Queries'

3️⃣ 从日志到数据库:关联慢请求与 SQL 查询

  • TOMCAT 日志中的 request URI 和参数可以手工比对对应业务接口所执行的 SQL。
  • Maven 项目中加入 JD娱乐 日志插件,即可在 TOMCAT 日志里直接看到 SQL 执行情况。再看示例配置,
# pom.xml snippet

com.github.gavlyukovskiy
log4jdbc-spring-boot-starter
0.12

注意:开启 JD娱乐 日志会产生大量输出。请仅在排查阶段使用,生产环境务必关闭。

自动化脚本的观点是,一键筛选并打印慢请求及对应 SQL 方法

# script.sh 示例
#!/bin/bash
LOG_DIR="/var/log/tomcat"
THRESHOLD=800 # ms
echo "=== 开始筛选超时请求 ==="
grep 'QTime=' $LOG_DIR/localhost_access_log.* | \
awk -F'QTime=' '{if print}'> $LOG_DIR/slow_requests_${THRESHOLD}ms.log
echo "=== 提取对应业务方法 ==="
awk '{print $7}' $LOG_DIR/slow_requests_${THRESHOLD}ms.log | sort | uniq> $LOG_DIR/business_paths.txt
echo "=== 完成!查看 $LOG_DIR/slow_requests_${THRESHOLD}ms.log 与 $LOG_DIR/business_paths.txt ==="

4️⃣ 调整要点汇总

A) Tomcat 层面调整

  • 线程池调优:`maxThreads`、`minSpareThreads` 与 `acceptCount` 根据 CPU 主要数与业务峰值调整一下。推荐先通过 `top`、`htop` 实测 CPU 占用,再做微调。
  • `connectionTimeout` 与 `keepAliveTimeout`:`connectionTimeout` 越小能更快回收无效连接;但太小会导致短链接异常,合理设置后可提高吞吐量。
  • `useBodyEncodingForURI="true"`:确保中文 URI 正确解析,避免因编码导致错误路由而影响性能。
  • `disableUploadTimeout="true"`:Suspend 长时间上传导致线程占用,可根据业务需求开启或关闭。
  • `maxHttpHeaderSize`:`maxHttpHeaderSize=32768` 可防止大 Header 被拒绝,提高兼容性。
  • `gzipCompressMimeTypes=`:`text/html,text/xml,text/plain,text/css,application/javascript,application/json。...` 开启 HTTP 压缩减少网络 I/O.
  • `jvmOptions`:** 设置堆大小与 GC 参数,例如: bash JA_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC" 监控 GC 日志后根据需要做进一步细调。

B) 数据库层面调整

  • ① **开启并持续分析 MySQL 慢查询日志**,建立有效索引;若是 InnoDB 则关注主键、覆盖索引。 怎么说呢,
  • ② **调整执行计划**:使用 `EXPLAIN ANALYZE` 检查热点 SQL 的执行方法;如果存在全表扫描及时加索引或重写语句。
  • ③ **合理配置连接池**:如 HikariCP。建议设置 `maximumPoolSize=50~100*CPU主要数`,`idleTimeout=300000`,`maxLifetime=1800000`;并开启 `autoCommit=false` 与事务隔离级别适配业务。
  • ④ **缓存热点数据**:引入 Redis/Memcached 缓存常用查询结果,减轻数据库压力。

C) 架构层面改造

  • ① **拆分服务**:将高并发读写分离,例如读写分离 MySQL 主从;对读密集型业务使用只读副本。其实,
  • ② **异步处理**:对于非实时响应需求。将耗时操作放入消息队列,减少前端等待时间。

D) 持续监控与反馈循环

  • ① 使用 Promeus + Grafana 收集 JVM 指标、TomCat 指标还有 MySQL 性能指标;设置阈值告警,
  • ② 每周回顾 Slow Query Report 与 Application Performance Dashboard,及时发现新瓶颈并做改进。

E) 快速排查清单

  1.   - 验证 Java & TomCat 正常运行;确认访问日志目录正确,  - top/htop/free/diskio/netstat 等工具实时观察 CPU、内存、磁盘 IO 与网络状况;记录峰值指标以供后续调整参考。  - 执行前述 `.sh 脚本` 筛选 QTime 超阈值请求。  - 用 `` 对 MySQL 慢查询进行统计。  - 将 HTTP 请求方法与对应 SQL 对齐,定位具体接口或业务逻辑。  - 根据上述数据决定是调整线程池、JVM GC、添加索引还是 SQL。 h— 在预发布环境复现问题,并验证改动效果;怎么说呢,确认无副作用后推送至生产。 h- 用 Grafana 仪表盘持续跟踪 RT 与错误率变化,并根据趋势做迭代调整。不过,: 每一步都要记录 baseline 指标。以便回滚或评估改动收益,

标签:Ubuntu

你在 Ubuntu 上使用 Tomcat 时往往会遇到以下痛点:

  • 不知道日志文件到底放在哪,找不到想看的慢请求。
  • 看到 QTime 字段却不清楚如何提取并判断是否真的慢。
  • 不懂如何把日志信息与数据库慢查询关联起来导致排查效率低。话说回来,
  • 缺乏一套可复用的调整清单。无法快速定位线程池、GC 或数据库索引等瓶颈。

下面的教程将一步步帮你解决这些问题,让你比较容易掌握 Ubuntu 下 Tomcat 慢查询的调整方法。

如何通过阅读这篇教程,轻松学会Ubuntu下Tomcat慢查询的优化方法?

1️⃣ 环境准备:Java 与 Tomcat 安装

安装 Java

# 更新软件源
sudo apt update
# 安装默认 JDK
sudo apt install default-jdk -y
# 验证安装
java -version

下载并解压 Tomcat

# 创建 tomcat 使用者和组
sudo groupadd tomcat
sudo useradd -s /bin/false -g tomcat tomcat
# 下载最新稳定版
cd /opt
sudo wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.23/bin/apache-tomcat-10.1.23.tar.gz
# 解压并设置权限
sudo tar xf apache-tomcat-10.1.23.tar.gz
sudo mv apache-tomcat-10.1.23 tomcat
sudo chown -R tomcat:tomcat tomcat

启动 Tomcat 并验证

# 切换到 tomcat 使用者开启服务
cd /opt/tomcat/bin
./startup.sh
# 浏览器访问 http://localhost:8080/ 确认页面正常

2️⃣ 定位访问日志文件

TOMCAT 的访问日志默认存放在:

如何通过阅读这篇教程,轻松学会Ubuntu下Tomcat慢查询的优化方法?
/var/log/tomcat/ 或者 /opt/tomcat/logs/ 

看日志目录结构示例:

# 查看目录列表
ls /var/log/tomcat | grep localhost_access_log
# 常见文件名格式: localhost_access_log.YYYY-MM-DD.txt
# QTime 字段记录每个请求的耗时

从常用命令来看。快速筛选 QTime 超过阈值的请求

# 阈值设为 800ms,可自行调整
grep 'QTime=' /var/log/tomcat/localhost_access_log.* | \
awk -F'QTime=' '{if print}'> slow_requests.log
# 查看结果示例
less slow_requests.log

再看更精准,利用 pt-query-digest 分析数据库慢查询日志

# MySQL 慢查询日志开启示例:
-- 在 my.cnf 中添加:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2 # 单位秒
# 安装 pt-query-digest 工具
sudo apt install percona-toolkit
# 分析慢查询日志并生成报告:
pt-query-digest /var/log/mysql/slow-query.log> mysql_slow_report.txt
# 查看最频繁且耗时最高的 SQL:
less mysql_slow_report.txt | grep 'Top Queries'

3️⃣ 从日志到数据库:关联慢请求与 SQL 查询

  • TOMCAT 日志中的 request URI 和参数可以手工比对对应业务接口所执行的 SQL。
  • Maven 项目中加入 JD娱乐 日志插件,即可在 TOMCAT 日志里直接看到 SQL 执行情况。再看示例配置,
# pom.xml snippet

com.github.gavlyukovskiy
log4jdbc-spring-boot-starter
0.12

注意:开启 JD娱乐 日志会产生大量输出。请仅在排查阶段使用,生产环境务必关闭。

自动化脚本的观点是,一键筛选并打印慢请求及对应 SQL 方法

# script.sh 示例
#!/bin/bash
LOG_DIR="/var/log/tomcat"
THRESHOLD=800 # ms
echo "=== 开始筛选超时请求 ==="
grep 'QTime=' $LOG_DIR/localhost_access_log.* | \
awk -F'QTime=' '{if print}'> $LOG_DIR/slow_requests_${THRESHOLD}ms.log
echo "=== 提取对应业务方法 ==="
awk '{print $7}' $LOG_DIR/slow_requests_${THRESHOLD}ms.log | sort | uniq> $LOG_DIR/business_paths.txt
echo "=== 完成!查看 $LOG_DIR/slow_requests_${THRESHOLD}ms.log 与 $LOG_DIR/business_paths.txt ==="

4️⃣ 调整要点汇总

A) Tomcat 层面调整

  • 线程池调优:`maxThreads`、`minSpareThreads` 与 `acceptCount` 根据 CPU 主要数与业务峰值调整一下。推荐先通过 `top`、`htop` 实测 CPU 占用,再做微调。
  • `connectionTimeout` 与 `keepAliveTimeout`:`connectionTimeout` 越小能更快回收无效连接;但太小会导致短链接异常,合理设置后可提高吞吐量。
  • `useBodyEncodingForURI="true"`:确保中文 URI 正确解析,避免因编码导致错误路由而影响性能。
  • `disableUploadTimeout="true"`:Suspend 长时间上传导致线程占用,可根据业务需求开启或关闭。
  • `maxHttpHeaderSize`:`maxHttpHeaderSize=32768` 可防止大 Header 被拒绝,提高兼容性。
  • `gzipCompressMimeTypes=`:`text/html,text/xml,text/plain,text/css,application/javascript,application/json。...` 开启 HTTP 压缩减少网络 I/O.
  • `jvmOptions`:** 设置堆大小与 GC 参数,例如: bash JA_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC" 监控 GC 日志后根据需要做进一步细调。

B) 数据库层面调整

  • ① **开启并持续分析 MySQL 慢查询日志**,建立有效索引;若是 InnoDB 则关注主键、覆盖索引。 怎么说呢,
  • ② **调整执行计划**:使用 `EXPLAIN ANALYZE` 检查热点 SQL 的执行方法;如果存在全表扫描及时加索引或重写语句。
  • ③ **合理配置连接池**:如 HikariCP。建议设置 `maximumPoolSize=50~100*CPU主要数`,`idleTimeout=300000`,`maxLifetime=1800000`;并开启 `autoCommit=false` 与事务隔离级别适配业务。
  • ④ **缓存热点数据**:引入 Redis/Memcached 缓存常用查询结果,减轻数据库压力。

C) 架构层面改造

  • ① **拆分服务**:将高并发读写分离,例如读写分离 MySQL 主从;对读密集型业务使用只读副本。其实,
  • ② **异步处理**:对于非实时响应需求。将耗时操作放入消息队列,减少前端等待时间。

D) 持续监控与反馈循环

  • ① 使用 Promeus + Grafana 收集 JVM 指标、TomCat 指标还有 MySQL 性能指标;设置阈值告警,
  • ② 每周回顾 Slow Query Report 与 Application Performance Dashboard,及时发现新瓶颈并做改进。

E) 快速排查清单

  1.   - 验证 Java & TomCat 正常运行;确认访问日志目录正确,  - top/htop/free/diskio/netstat 等工具实时观察 CPU、内存、磁盘 IO 与网络状况;记录峰值指标以供后续调整参考。  - 执行前述 `.sh 脚本` 筛选 QTime 超阈值请求。  - 用 `` 对 MySQL 慢查询进行统计。  - 将 HTTP 请求方法与对应 SQL 对齐,定位具体接口或业务逻辑。  - 根据上述数据决定是调整线程池、JVM GC、添加索引还是 SQL。 h— 在预发布环境复现问题,并验证改动效果;怎么说呢,确认无副作用后推送至生产。 h- 用 Grafana 仪表盘持续跟踪 RT 与错误率变化,并根据趋势做迭代调整。不过,: 每一步都要记录 baseline 指标。以便回滚或评估改动收益,

标签:Ubuntu