温馨提示×

linux如何定位tomcat慢请求

小樊
64
2026-10-05 13:51:21
栏目: 智能运维

在 Linux 环境下定位 Tomcat 慢请求(响应慢、卡顿),通常需要从 系统层 → JVM 层 → Tomcat 层 → 应用层 逐步排查。下面是一套实战可用的定位思路和方法。


一、先确认“慢”发生在哪一层

1. 系统资源是否瓶颈

top
htop
vmstat 1
iostat -x 1

重点关注:

  • CPU 是否长期高负载
  • 内存是否 swap
  • 磁盘 IO 是否 100%
  • 网络是否丢包/延迟
free -h
df -h

2. 网络层面慢(客户端到 Tomcat)

ping tomcat_ip
telnet ip 8080
curl -w "@curl-format.txt" http://ip:8080/url

curl-format 示例:

time_namelookup: %{time_namelookup}
time_connect: %{time_connect}
time_starttransfer: %{time_starttransfer}
time_total: %{time_total}

二、Tomcat 层定位

1. 查看 Tomcat 访问日志(最重要)

Tomcat access_log:

tail -f catalina.out
tail -f localhost_access_log.*.txt

重点关注:

  • 请求耗时字段(如果配置了 %D 或 %T)
  • 哪些 URL 慢
  • 是否某些接口一直慢

推荐 access_log 配置:

pattern="%h %l %u %t "%r" %s %b %D"
  • %D:请求耗时(毫秒)

2. Tomcat 线程是否打满

查看 server.xml:

<Connector port="8080"
           maxThreads="200"
           acceptCount="100" />

线程打满表现:

  • 请求排队
  • 响应时间突然变长

查看线程数:

ps -T -p <tomcat_pid> | wc -l

三、JVM 层定位(核心)

1. 找到 Tomcat 进程

ps -ef | grep tomcat
jps -l

2. 查看 GC 是否频繁(非常常见原因)

jstat -gcutil <pid> 1000

重点看:

  • FGC / FGCT 是否很高
  • O (Old区) 是否接近 100%

开启 GC 日志(推荐):

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

3. 线程 dump(定位卡在哪段代码)

jstack <pid> > thread.log

分析重点:

  • BLOCKED
  • WAITING
  • 大量线程卡在同一个方法

例如:

"scheduler-1" #23 prio=5
   java.lang.Thread.State: WAITING
   at java.lang.Object.wait
   at com.xxx.dao.query()

4. 实时线程监控

top -Hp <pid>

把高 CPU 线程 ID 转成 16 进制:

printf "%x\n" <tid>

再到 jstack 中搜索。


四、应用层定位(代码慢)

1. 慢 SQL(最常见)

  • 开启 MySQL 慢查询日志
slow_query_log = ON
long_query_time = 1

2. 外部接口调用慢

  • 第三方 HTTP
  • Redis / MQ 超时

3. 日志定位

在代码中增加:

  • 方法级耗时日志
  • AOP 统计接口耗时

五、常用“组合拳”示例

场景:接口偶发慢

# 1. 抓 access_log 慢请求
grep '耗时>1000' localhost_access_log.*

# 2. 抓线程栈
jstack pid > t1.log
sleep 5
jstack pid > t2.log

# 3. 对比线程状态

六、推荐工具(进阶)

  • Arthas(强烈推荐)
trace com.xxx.controller.* *
  • VisualVM / JProfiler
  • Prometheus + Grafana
  • APM(SkyWalking / Pinpoint)

七、总结排查顺序

  1. 系统资源(CPU/IO/网络)
  2. Tomcat access_log
  3. JVM GC / 线程
  4. 应用代码 / SQL / 外部依赖

如果你愿意,可以把:

  • Tomcat 版本
  • 慢请求现象(偶发/持续)
  • access_log 示例
  • CPU / 内存情况

发给我,我可以帮你做针对性分析。

0 踩