温馨提示×

如何定位debian tomcat慢请求

小樊
47
2026-09-19 10:39:47
栏目: 智能运维

在 Debian 上定位 Tomcat 慢请求(slow request),一般可以从 系统层 → 网络层 → Tomcat 层 → 应用层 逐级排查。下面是一套实用思路和命令。


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

1. 系统资源是否瓶颈

top
htop
free -h
df -h
iostat -x 1

重点看:

  • CPU 是否打满
  • 内存是否 swap
  • 磁盘 IO 是否高
  • 网络带宽是否占满

2. 网络层是否慢

ping <client_ip>
traceroute <client_ip>
ss -tnp | grep 8080

关注:

  • TCP 连接是否大量 TIME_WAIT / ESTABLISHED
  • 是否有连接堆积

二、Tomcat 层定位

1. 查看 Tomcat 线程状态(非常重要)

jstack <tomcat_pid> > tomcat.jstack

看是否有:

  • 大量线程 BLOCKED
  • 线程卡在:
    • 数据库
    • 远程 HTTP 调用
    • 锁(synchronized)

常见卡点:

java.net.SocketInputStream.read
java.sql.Connection
org.apache.http

2. 开启 Tomcat Access Log(必须)

编辑:

/etc/tomcat9/server.xml

确保有:

<Valve className="org.apache.catalina.valves.AccessLogValve"
       pattern="%h %l %u %t "%r" %s %b %D" />
  • %D:请求耗时(毫秒)
  • %F:响应时间(微秒)

日志位置一般在:

/var/log/tomcat9/access.log

分析慢请求:

awk '$NF > 1000' access.log

3. 调整 Tomcat 线程池

<Executor name="tomcatThreadPool"
          maxThreads="200"
          minSpareThreads="20"/>

如果线程不够,请求会排队。


三、应用层定位(最常见原因)

1. 开启应用日志耗时

在 Controller / Service 加:

long start = System.currentTimeMillis();
// business
log.info("cost={}", System.currentTimeMillis() - start);

2. 数据库慢查询(极高概率)

slow_query_log = ON
long_query_time = 1

MySQL:

SHOW PROCESSLIST;

3. 使用 Arthas(强烈推荐)

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

常用:

trace com.xxx.Controller method
watch com.xxx.Service * '{params,returnObj}'
thread

四、Debian 特有注意点

1. JVM 参数

查看:

ps -ef | grep tomcat

确认:

  • -Xms
  • -Xmx
  • GC 参数

2. systemd 限制

systemctl show tomcat9 | grep Limit

可能限制:

  • 文件描述符
  • 线程数

五、快速定位套路(总结)

  1. access log 看哪些请求慢
  2. jstack 看线程卡在哪
  3. 数据库 / 远程调用 / 锁
  4. arthas trace 精确方法耗时

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

  • Tomcat 版本(如 9 / 10)
  • 是否连接 MySQL / Redis
  • 慢请求是偶发还是持续

我可以直接帮你给出更针对性的排查方案。

0 踩