如何配置JMeter使请求无需等待响应,按每秒1次频率发送
解决JMeter每秒发一次请求(无需等待响应)的问题
为什么Constant Throughput Timer无效?
Constant Throughput Timer是基于采样完成时间来调控吞吐量的,它需要等待上一个请求完全结束(收到响应)后,才会计算下一次请求的触发时机。你的请求响应耗时5秒,所以每次循环都要等5秒才会发下一个,自然总耗时50秒,达不到每秒1次的发送频率。
设置请求超时是否可行?
可行,但有明显弊端:
- 把HTTP请求的超时时间设为极短(比如1毫秒),JMeter会在超时后立即终止等待,进入下一个请求,确实能实现每秒发一次,但所有请求会被标记为「超时失败」。
- 如果你的测试只需要模拟请求发送频率,不需要关注响应结果,这个方法可以临时用,但会导致JMeter主动断开连接,可能造成服务端的连接资源未正常释放,长期测试可能影响服务稳定性。
更优解决方案
1. 使用异步HTTP请求(推荐)
在HTTP请求采样器的「高级」标签页中,勾选「异步请求」(部分JMeter版本标注为Async Request)。开启后,JMeter发送请求后会立即执行下一个步骤,无需等待响应。
- 配合Constant Timer(设置1000毫秒),线程组循环10次,就能实现每秒发送1次请求,总耗时约10秒。
- 若需要获取响应,可后续添加「异步请求响应采样器」来收集异步请求的返回结果。
2. 用JSR223 Sampler编写异步请求脚本
通过Groovy脚本实现异步HTTP请求,发送后直接进入下一个步骤,完全脱离同步等待的限制。示例脚本:
import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse import java.net.URI // 初始化HTTP客户端 def httpClient = HttpClient.newHttpClient() // 构建请求 def request = HttpRequest.newBuilder() .uri(URI.create("你的目标请求URL")) .method("GET", HttpRequest.BodyPublishers.noBody()) // 根据实际请求方法调整 .build() // 异步发送请求,不阻塞后续执行 httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
- 在JSR223 Sampler后添加Constant Timer(1000毫秒),线程组循环10次,即可实现每秒1次的发送频率。
- 这种方式灵活性更高,可自定义请求头、参数等,适合复杂场景。
3. 使用Parallel Controller(适用于批量异步场景)
若需要一次性发起多个异步请求并控制间隔,可将HTTP请求放入Parallel Controller,结合Loop Controller和Constant Timer实现:
- 线程组设置1用户,循环10次。
- 每次循环内添加Parallel Controller,放入HTTP请求(开启异步)。
- 在Parallel Controller外添加Constant Timer(1000毫秒),确保每次循环间隔1秒。
内容的提问来源于stack exchange,提问作者Nathan Drake
相关产品推荐
相关产品推荐

