Apache Benchmark首请求非并发问题排查与解决咨询
问题原因及解决方法
核心原因
1. Apache Benchmark(ab)的默认协议与请求调度逻辑
ab默认使用HTTP/1.0协议,该协议默认不支持持久连接(Keep-Alive),每个请求都需要新建TCP连接。ab的早期实现逻辑是先发送第一个请求,等待其连接完全关闭后,再批量创建剩余的并发连接并发送请求,这就导致第一个请求单独执行,剩余请求才并行处理。
2. 目标服务的首次初始化开销
首次请求Spring Boot应用时,会触发Tomcat容器的线程池初始化、相关类加载、依赖实例化等操作,这些初始化工作会增加第一个请求的处理时间,让它看起来像是单独执行;而后续请求可以复用已初始化的资源,从而实现并行处理。
解决方法
1. 启用HTTP/1.1持久连接
在ab命令中添加-k参数,强制使用HTTP/1.1并开启Keep-Alive,这样ab可以在同一个TCP连接上发送多个请求,并发逻辑会符合预期。示例命令:
ab -n 4 -c 4 -k http://localhost:8080/block/10
2. 预热目标服务
在正式基准测试前,先发送1-2个请求触发服务初始化,避免首次请求的初始化开销干扰测试结果。比如先执行:
ab -n 1 -c 1 http://localhost:8080/block/10
再运行正式的并发测试命令。
3. 调整ab的并发参数(可选)
如果上述方法效果不佳,可以尝试添加-r参数忽略连接错误,确保并发请求的稳定性;同时可以通过-v 2参数查看请求的协议细节,确认是否正确使用了HTTP/1.1。
内容的提问来源于stack exchange,提问作者FrozenHat
相关产品推荐
相关产品推荐

