如何在JMeter事务控制器中并行运行请求?解决线程数超标问题
如何在JMeter中模拟混合串行/并行的登录事务(替代LoadRunner的web_concurrent_start)
核心问题分析
你遇到的线程暴增问题,是因为默认Parallel Controller会为每个子请求创建独立线程,这和浏览器的并行请求逻辑不符。浏览器是在同一个会话线程内异步发起多个请求,而非创建大量线程。要实现类似LoadRunner web_concurrent_start()的效果,需要用更贴合浏览器行为的并发控制方式。
解决方案步骤
1. 安装bzm - Parallel Controller插件
这个插件提供了同线程内异步执行请求的模式,不会额外创建线程,完美匹配浏览器的并行请求逻辑。可以通过JMeter插件管理器搜索「bzm - Parallel Controller」一键安装,也可以手动下载jar包放到JMeter的lib/ext目录下重启JMeter。
2. 配置并行控制器的执行模式
将需要并行执行的请求放入bzm - Parallel Controller,然后修改控制器的核心配置:
- 找到Execution Mode选项,选择「Parallel execution within the same thread (using HttpClient Async)」
- 可选:设置Max Concurrency参数,匹配浏览器的并发连接限制(比如Chrome默认单域名6个并发)
3. 组合串行与并行逻辑
按照浏览器实际请求顺序组织JMeter结构:
- 串行部分:直接放在线程组下(比如初始的登录页面GET请求、登录表单提交请求)
- 并行部分:将需要同时发起的请求(如静态资源、并行接口)放入配置好的
bzm - Parallel Controller中
示例结构:
Thread Group(2个线程,1个用户/线程) - HTTP Request: GET 登录页面(串行) - bzm - Parallel Controller(同线程异步模式) - HTTP Request: 加载登录页CSS - HTTP Request: 加载登录页JS - HTTP Request: 获取验证码接口 - HTTP Request: POST 登录表单(串行) - bzm - Parallel Controller(同线程异步模式) - HTTP Request: 获取用户菜单接口 - HTTP Request: 获取系统通知接口
4. 事务统计配置
如果需要统计整个登录流程的总耗时,直接将上述整个结构放入Transaction Controller即可。注意勾选控制器的「Include duration of timer and pre-post processors in generated sample」选项,确保统计完整的事务耗时。
验证与注意事项
- 线程数验证:运行脚本后,JMeter的线程数应与你线程组设置的一致(比如2个),不会出现几百个额外线程
- HTTP请求实现:确保所有HTTP请求的「Implementation」设置为「HttpClient4」,异步模式依赖该实现
- 对照浏览器请求:通过开发者工具的「网络」标签,确认并行请求的分组和顺序,保证JMeter结构与实际浏览器行为一致
内容的提问来源于stack exchange,提问作者Mrunalini Kancharla
相关产品推荐
相关产品推荐

