如何正确配置JMeter组合采样器以模拟服务并发场景?
问题分析
你的核心问题是:当用JMeter并发测试两个串行服务请求时,CPU密集型的service1在高并发下未出现预期的响应时间上升。原因是JMeter默认的线程启动节奏和请求发送方式,没有让service1的单核CPU达到饱和排队状态。service1绑定到CPU0,单核处理10个并发请求时必须串行执行,理论上响应时间应线性增长,但实际每个请求仍能快速处理,说明请求并非同时到达service1,未形成排队压力。
解决方案
1. 调整JMeter测试计划结构
确保测试计划层级如下:
- 线程组(线程数=10,Ramp-Up=0,循环次数=10)
- 同步定时器(Synchronizing Timer)
- HTTP请求(sampler1:访问service1的sum接口,n=10000000)
- HTTP请求(sampler2:访问service2的sum接口,n=20000000)
- 同步定时器(Synchronizing Timer)
2. 配置同步定时器
在sampler1前添加同步定时器,设置「Number of Simultaneous Users to Group by」为10,让所有10个线程在发送sampler1请求前同步等待,瞬间触发10个并发请求到service1。这样service1的单核CPU会同时收到10个请求,进入排队处理状态,响应时间会上升到约60ms,符合预期。
3. 验证WildFly线程池配置
确保WildFly的工作线程数足够接收并发请求(默认配置通常满足,可检查standalone.xml中的线程配置):
<subsystem xmlns="urn:jboss:domain:undertow:12.0"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <response-header name="server-header" header-name="Server" header-value="WildFly"/> <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow"/> </filters> </subsystem>
4. 调整JMeter基础配置
- 设置HTTP请求的超时时间为1000ms以上,避免请求被提前中断
- 启用聚合报告和查看结果树组件,确保完整收集每个请求的响应时间数据
预期结果
配置完成后:
- N=1时,总响应时间约为6+12=18ms
- N=10时,sampler1平均响应时间约60ms,sampler2约120ms,总响应时间约180ms
内容的提问来源于stack exchange,提问作者uni
相关产品推荐
相关产品推荐

