Tomcat日志出现连接超时的定位与处理
一、先快速定位超时发生在哪一段链路
tail -f $CATALINA_HOME/logs/catalina.out。二、常见根因与对应处置要点
| 场景 | 典型日志/现象 | 处置要点 |
|---|---|---|
| 客户端提前关闭 | 出现 ClientAbortException / “您的主机中的软件中止了一个已建立的连接” | 多为客户端超时或取消,适当延长 connectionTimeout,优化响应时间,必要时增加前端/网关超时与重试/断点续传策略 |
| 反向代理读写超时 | Nginx 返回 504 Gateway Timeout;Tomcat 侧日志无明显错误 | 同步调大 proxy_connect_timeout / proxy_send_timeout / proxy_read_timeout / send_timeout,并确认与 Tomcat 的 connectionTimeout 匹配 |
| Tomcat线程池耗尽 | 请求排队、线程数打满、acceptCount 队列满 | 适度提高 maxThreads / acceptCount,并优化慢接口与阻塞操作 |
| 数据库/外部依赖慢或连接池不足 | 接口 RT 高、连接池获取连接超时、DB 连接数打满 | 优化 SQL 与索引、提升连接池大小与超时/验证策略,必要时做读写分离/缓存 |
| JVM/系统资源不足 | 频繁 GC、CPU/内存紧张、文件描述符用尽 | 调整 JVM 堆与GC、提升 ulimit -n、检查容器/宿主机资源 |
三、关键配置示例与建议值
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="30000"
maxThreads="200"
minSpareThreads="25"
acceptCount="100"
maxKeepAliveRequests="100"
redirectPort="8443" />
location / {
proxy_pass http://tomcat_servers;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
connection-test-query: select 1),并根据负载调大最大连接数与超时,避免获取连接超时与连接泄漏。四、代码与架构层面的优化
@WebServlet(asyncSupported = true)
public class AsyncServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext ctx = req.startAsync();
ctx.start(() -> {
try {
// 长时处理
ctx.getResponse().getWriter().write("done");
} catch (IOException e) {
e.printStackTrace();
} finally {
ctx.complete();
}
});
}
}
五、验证与回退