Nginx $upstream_header_time过高 Tomcat处理耗时低问题排查求助
Nginx upstream_header_time异常偏高排查思路
1 内核/系统层面排查(优先级最高)
- 首先抓本地回环TCP包确认报文实际收发时间,执行命令
tcpdump -i lo port 8801 -w tomcat_traffic.pcap,对比请求包发送到响应首包的实际时间差:- 如果时间差确实为5s,说明问题出在内核报文交付环节,和Nginx内部逻辑无关
- 如果时间差和Tomcat的17ms耗时一致,说明问题出在Nginx用户态处理环节
- 检查CentOS7 3.10内核的TCP参数,重点确认是否同时开启了
tcp_tw_recycle和tcp_timestamps:本地回环场景下该组合会触发TIME_WAIT连接回收异常,导致响应报文被直接丢弃,5s正好是TCP第一次重传的默认RTO超时时间,和你的现象完全匹配 - 检查socket队列溢出情况,执行
ss -lntp | grep -E 'nginx|8801'查看Recv-Q、Send-Q是否持续高位,执行netstat -s | grep -i "listen queue"确认是否有队列溢出的计数增长 - 检查系统及进程级文件句柄限制,查看Nginx、Tomcat进程的
ulimit -n配置,同时检查/var/log/messages是否有Too many open files相关报错
2 Nginx配置层面排查
- 确认上游keepalive配置是否完整:必须同时配置
proxy_http_version 1.1;和proxy_set_header Connection "";,如果漏了清空Connection头的配置,Nginx会默认向上游发送Connection: close,长连接不生效会频繁触发建连、断连逻辑 - 检查Nginx worker进程状态,执行
top -p $(pidof nginx)确认是否有worker进程CPU占满100%的情况,CPU占满会导致epoll事件回调不及时,引发请求堆积 - 检查Nginx连接数是否打满:执行
netstat -anp | grep nginx | wc -l,对比worker_connections * worker_processes的配置值,连接数打满会导致新事件无法及时处理 - 调大Nginx error日志级别到debug,查看是否有
upstream timed out、connection reset by peer等异常报错,可定位请求处理各阶段的耗时卡点
3 Tomcat配置层面排查
- 检查Tomcat Connector的
TCP_NODELAY配置是否开启:未开启的情况下Nagle算法会攒小报文(HTTP响应头属于典型小报文)再发送,会引发首字节延迟升高 - 查看Tomcat GC日志,确认是否有长时间FULL GC停顿发生在响应写完之后,导致内核没有及时调度发送报文
- 确认Tomcat日志的计时逻辑:%D是从请求接收开始到响应完全写入socket缓冲区的总耗时,如果17ms已经包含写缓冲区的时间,即可排除Tomcat侧处理的问题
4 关于Nginx内部队列阻塞的可能性说明
存在该场景,但概率远低于上述内核参数、配置错误的问题,仅在以下场景触发:
- Nginx共享内存锁竞争(比如配置了高频读写的共享内存缓存)
- 第三方模块bug引发的worker进程阻塞
- Nginx worker进程优先级被调整过低,无法及时得到CPU调度
内容的提问来源于stack exchange,提问作者拽拽的烟灰
相关产品推荐
相关产品推荐

