Tomcat9相同请求下本地吞吐量3000req/s、远程仅200req/s排查求助
跨主机压测吞吐量暴跌排查思路
1. 网络层基础排查
- 先测试两台主机的基础网络指标:用
ping检测平均时延、丢包率,用iperf3测试两端实际可用带宽,确认网络本身不存在带宽不足、高时延或随机丢包问题。 - 核对两台主机之间的防火墙、安全组、反向代理、WAF等中间设备配置,确认未针对压测端IP配置QPS限流、并发连接数限制、流量清洗规则。
- 用
tcpdump在服务端抓包分析请求链路,确认是否存在大量TCP重传、握手失败、延迟ACK等异常情况。
2. 系统内核参数排查
服务端配置校验:
- 检查
net.core.somaxconn参数值,该值需要大于等于Tomcat Connector中配置的acceptCount,否则内核层面会直接丢弃超出队列的TCP握手请求。 - 检查
net.ipv4.tcp_tw_reuse是否开启,net.ipv4.tcp_tw_recycle注意NAT环境下禁止开启,避免TIME_WAIT状态的连接占满资源导致无法建立新连接。 - 检查
net.core.netdev_max_backlog、net.ipv4.tcp_max_syn_backlog配置,确认不会因为内核队列过小丢弃请求。 - 检查进程文件句柄限制:执行
ulimit -n查看Tomcat进程的最大打开文件数,TCP连接每个都会占用一个文件句柄,需要确保上限远高于压测的并发连接数。
压测端配置校验:
- 检查
net.ipv4.ip_local_port_range端口范围配置,短连接压测时如果端口范围过小,会出现端口耗尽无法发起新请求的问题。 - 同样校验压测端的TIME_WAIT相关参数、进程文件句柄限制,排除压测端本身成为性能瓶颈的可能。
3. Tomcat配置校验
- 当前配置的
protocol="HTTP/1.1"在Tomcat 9中默认对应NIO模式,可显式指定为org.apache.coyote.http11.Http11NioProtocol避免误用到BIO模式导致性能下降。 - 检查是否开启了同步写入的AccessLog,跨网络压测时请求日志量大会导致磁盘IO阻塞,拉低吞吐量。
- 若使用短连接压测,建议调整Connector的
keepAliveTimeout、maxKeepAliveRequests参数,开启长连接复用,降低TCP握手开销。 - 压测时监控Tomcat线程池状态,确认maxThreads配置足够,没有出现线程耗尽请求排队的情况。
4. 压测逻辑校验
- 先使用成熟压测工具(如wrk、JMeter)做复测,排除自行编写的压测程序本身存在Bug的可能。
- 确认压测程序的并发配置和本地压测时完全一致,未修改并发线程数、请求间隔等参数。
- 检查压测程序是否为异步发送请求,若为单线程同步等待响应再发送下一个请求,网络时延会直接导致压测端并发上不去,得到偏低的吞吐量结果。
5. 应用层逻辑排查
- 检查应用代码中是否存在基于客户端IP的限流、鉴权逻辑,远程压测端IP被触发限流规则,导致请求被拦截或延迟处理。
- 压测时用
jstack、Arthas等工具抓取服务端线程栈,确认是否有大量线程阻塞在网络IO、数据库调用、锁等待等位置,定位具体性能瓶颈点。 - 压测时监控JVM GC情况,确认没有频繁Full GC导致STW,拉低整体吞吐量。
内容的提问来源于stack exchange,提问作者Richard.s
相关产品推荐
相关产品推荐

