温馨提示×

如何定位tomcat慢请求

小樊
34
2026-10-02 16:17:04
栏目: 智能运维

定位 Tomcat 中的慢请求(slow request),通常需要从 应用层、Tomcat 层、系统层 三个维度入手。下面是一套比较实用的排查思路和工具清单。


一、快速判断:是 Tomcat 慢,还是业务慢?

先确认慢请求的特征:

  • 所有接口都慢?→ 可能是 Tomcat / JVM / 系统问题
  • 只有某些接口慢?→ 大概率是业务代码或数据库问题
  • 偶发慢?→ 可能是 GC、锁、线程池满

二、Tomcat 本身定位手段

1. 开启 Tomcat 访问日志(最基础)

conf/server.xml 中启用 AccessLog:

<Valve className="org.apache.catalina.valves.AccessLogValve"
       directory="logs"
       prefix="access_log"
       suffix=".txt"
       pattern="%h %l %u %t "%r" %s %b %D" />

重点字段:

  • %D:请求处理时间(毫秒)
  • %r:请求行
  • %t:时间

Example:

192.168.1.10 - - [10/Oct/2024:10:00:00] "GET /api/test HTTP/1.1" 200 1234 1523

→ 这个请求花了 1523ms


2. 使用 Tomcat 自带线程监控

查看 conf/server.xml 的 Connector:

<Connector port="8080"
           protocol="HTTP/1.1"
           maxThreads="200"
           acceptCount="100"
           connectionTimeout="20000" />

关注:

  • maxThreads 是否打满
  • connectionTimeout 是否过小或过大

3. 开启 JMX 监控(推荐)

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

用 JConsole / VisualVM 看:

  • 线程数
  • 阻塞线程
  • CPU 使用

三、定位“慢在哪个阶段”

1. 请求处理慢(业务代码)

使用 Arthas(强烈推荐)

trace com.xxx.controller.OrderController queryOrder

可以看到:

  • 每个方法耗时
  • 是哪一行代码慢

2. 数据库慢

  • 开启慢 SQL 日志(MySQL):
slow_query_log = 1
long_query_time = 1
  • 用 Arthas:
trace com.xxx.mapper.OrderMapper selectByExample

3. GC 导致慢

查看 GC 日志:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log

重点看:

  • Full GC 频率
  • Stop-The-World 时间

4. 网络 / 客户端慢

  • 请求进来慢(Tomcat 已接收但没处理)
  • 响应返回慢(业务已结束但网络慢)

可用:

  • tcpdump
  • nginx 日志对比

四、高级手段(生产环境)

1. Async Profiler(CPU / 火焰图)

./profiler.sh -d 30 -f flamegraph.html <pid>

能直观看到:

  • 哪个方法吃 CPU
  • 是否锁竞争

2. 线程 Dump 分析

jstack <pid> > thread.txt

看:

  • BLOCKED
  • WAITING
  • 线程池耗尽

五、常见慢请求原因总结

原因 表现
线程池满 请求排队
慢 SQL 单接口慢
同步阻塞 线程 WAITING
GC 频繁 偶发全慢
外部接口慢 第三方调用慢
日志过多 IO 阻塞

六、推荐排查顺序(实战)

  1. AccessLog 看哪些 URL 慢
  2. Arthas trace 定位方法
  3. 看线程 Dump / GC
  4. 数据库慢 SQL
  5. 系统资源(CPU、IO、网络)

如果你愿意,可以告诉我:

  • Tomcat 版本
  • 是否使用 Spring Boot
  • 慢请求是全部还是个别接口

我可以给你更具体的命令和配置示例。

0 踩