温馨提示×

如何排查Ubuntu Tomcat的响应慢问题

小樊
47
2026-01-11 12:13:38
栏目: 智能运维

Ubuntu Tomcat响应慢的排查与优化

一 快速定位问题范围

  • 系统资源是否瓶颈:用top/htop观察CPUload average;用free -h查看内存swap;用vmstat 1si/so(换入换出);用df -h确认磁盘剩余;用netstat -sss -s观察重传率连接状态。这些能快速判断是CPU密集内存不足/泄漏磁盘IO还是网络问题。
  • 应用与容器是否过载:查看**/var/log/tomcat/catalina.out是否有OutOfMemoryError**、长时间GC停顿或异常堆栈;用jps定位Tomcat PID,再用jstat -gc 1s观察YGC/FGC次数与停顿;用jcmd Thread.printjstack 抓取线程快照,排查BLOCKED/WAITING线程。
  • 外部依赖是否拖慢:确认数据库缓存第三方APIRT错误率,必要时在应用侧增加超时熔断

二 定位慢请求与线程瓶颈

  • 访问日志筛选慢请求:Tomcat 的访问日志通常位于**/var/log/tomcat/,文件名以localhost_access_log.开头,字段中包含QTime**(单位毫秒)。可用以下方式找出超过阈值的请求(示例阈值800 ms):
    • 直接过滤:grep ‘QTime=’ localhost_access_log.* | awk -F’QTime=’ ‘{if($2+0>800) print}’
    • 脚本化:
      #!/usr/bin/env bash
      LOG=$1; THRESHOLD=${2:-800}
      awk -F'QTime=' -v t="$THRESHOLD" '$2+0>t {print}' "$LOG"
      
    这样可以快速锁定是个别接口还是普遍变慢
  • 线程池是否成为瓶颈:
    • 获取 Tomcat 进程号:PID=$(ps -aux | awk ‘$11 ~ /java/ && $0 ~ /tomcat/ {print $2; exit}’)
    • 查看线程数:ps -Lf $PID | wc -l
    • 若线程接近或达到上限,且出现排队,需在server.xml的**中调大maxThreads**(默认200)、acceptCount(默认100),并确认protocol="HTTP/1.1"使用的是NIO(性能通常优于BIO)。
  • 连接器与超时:结合业务并发与RT,适当增大connectionTimeout,避免过早断开或长时间占用连接。

三 常见根因与修复建议

  • SecureRandom 阻塞导致启动或首访极慢:在部分Ubuntu + OpenJDK环境中,初始化SecureRandom可能因熵池不足而长时间阻塞。可在**$CATALINA_HOME/bin/catalina.shJAVA_OPTS中加入:
    -Djava.security.egd=file:/dev/./urandom
    或在
    $JAVA_HOME/jre/lib/security/java.security中将securerandom.source=file:/dev/random改为file:/dev/urandom**,然后重启 Tomcat。
  • 内存不足或频繁 Full GC:通过jstat -gc观察FGCFGCT;若频繁或单次停顿过长,先排查内存泄漏(对象生命周期、缓存策略),再考虑堆大小GC策略调优。
  • 线程池与连接器配置不当:并发上来后若maxThreads过小会排队,过大则增加上下文切换;优先使用NIO并合理设置maxThreads/acceptCount/connectionTimeout
  • 数据库或外部依赖慢:为JDBC配置合理连接池(如最大连接、最小空闲、超时),并为慢查询建立索引语句优化;对外部接口设置超时/重试/熔断
  • 网络问题:若丢包/重传高或带宽打满,需联动网络侧排查(交换机、路由、安全组、带宽配额)。

四 监控与持续优化

  • JMX + 可视化:在catalina.sh中开启JMX(示例端口9010),用JConsole/VisualVM远程连接,持续观察堆内存线程数类加载MBean指标。
  • Tomcat 管理器与应用性能监控:启用**/manager/status**(配置tomcat-users.xmlmanager-gui角色),或使用JavaMelody/Lambda Probe等插件,观察请求吞吐会话数SQL错误率
  • 系统与应用日志联动:用tail -f catalina.out实时查看错误与长时间任务;结合访问日志GC日志趋势分析容量规划

0