使用 JMeter 进行测试:如何每秒运行 N 个请求

Posted

技术标签:

【中文标题】使用 JMeter 进行测试:如何每秒运行 N 个请求【英文标题】:Testing with JMeter: how to run N requests per second 【发布时间】:2011-06-28 11:28:42 【问题描述】:

我需要测试我们的系统是否可以每秒执行 N 个请求。 从技术上讲,它是对一个 API 的 2 个请求,对另一个 API 的 2 个请求,以及对第三个 API 的 6 个请求。 但重要的是它们应该同时发生 - 所以每秒 10 个请求。 因此,在 JMeter 中,我创建了三个线程组,首先定义线程数 1 和加速时间 0。 第二个线程组相同,第三个线程组定义线程数 6 和加速时间 0。 但这并不能真正保证它会每秒运行一次 我该如何模仿呢?我如何查看结果——它是否能够执行?

谢谢!

【问题讨论】:

这与:***.com/questions/4232700/… 使用相同的解决方案 @lb_lb 提到。 “在尝试实现目标百分比的请求以以相同比例实例化 Vuser 时,这是一种常见的误解。这仅在每种类型的请求的平均响应时间 (ART) 相同时才有效。例如,搜索请求 ART 与注册请求的 RT 不太可能相同。因此,在执行测试一段时间后,(每种类型的)请求的实际比例将不同于目标请求比例。” 【参考方案1】:

你可以使用ConstantThroughputTimer

引用以下 JMeter 帮助文件:

18.6.4 恒定吞吐量定时器 此计时器引入了可变暂停,计算以使总吞吐量(以每分钟样本数计)尽可能接近给定数字。当然,如果服务器无法处理它,或者如果其他计时器或耗时的测试元素阻止它,吞吐量将会降低。 注:虽然 Timer 被称为 Constant Throughput 定时器,但吞吐量值不需要是恒定的。它可以根据变量或函数调用来定义,并且可以在测试期间更改值。

例如我用它每秒生成 40 个请求:

 <ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer" enabled="true">
      <stringProp name="calcMode">all active threads in current thread group</stringProp>
      <doubleProp>
        <name>throughput</name>
        <value>2400.0</value>
        <savedValue>0.0</savedValue>
      </doubleProp>
    </ConstantThroughputTimer>

这是一个总结:

Created the tree successfully using performance/search-performance.jmx
Starting the test @ Tue Mar 15 16:28:39 CET 2011 (1300202919244)
Waiting for possible shutdown message on port 4445
Generate Summary Results +  3247 in  80,3s =   40,4/s Avg:    18 Min:     0 Max:  1328 Err:   108 (3,33%)
Generate Summary Results +  7199 in 180,0s =   40,0/s Avg:    15 Min:     1 Max:  2071 Err:   378 (5,25%)
Generate Summary Results = 10446 in 260,3s =   40,1/s Avg:    16 Min:     0 Max:  2071 Err:   486 (4,65%)
Generate Summary Results +  7200 in 180,0s =   40,0/s Avg:    14 Min:     0 Max:   152 Err:   399 (5,54%)
Generate Summary Results = 17646 in 440,4s =   40,1/s Avg:    15 Min:     0 Max:  2071 Err:   885 (5,02%)
Generate Summary Results +  7199 in 180,0s =   40,0/s Avg:    14 Min:     0 Max:  1797 Err:   436 (6,06%)
Generate Summary Results = 24845 in 620,4s =   40,0/s Avg:    15 Min:     0 Max:  2071 Err:  1321 (5,32%)

但我在我的网络中运行此测试。

【讨论】:

不确定为什么这不是公认的答案。有更多的选票,对我来说非常好。【参考方案2】:

与任何网络测试一样,总会出现问题,尤其是在延迟方面 - 即使您可以每秒准确发送 6 个,它们也会按顺序发送(这就是数据包的发送方式发送)并且可能不会在那一秒内全部命中,加上处理时间。

通常,当性能指标特定于每秒 x 时,它是在一段时间内测量的。你的 API 甚至可能有一个缓冲区——所以从技术上讲,你可以每秒发送 6 个,但每秒处理 5 个,缓冲区为 20,这意味着它可以处理 20 秒的流量,因为你已经发送了 120 个,这处理时间为 120/5 = 24 秒。但除此之外,缓冲区会溢出。因此,仅在一秒钟内准确发送 6 个进行测试是不够的。

在线程组中,您正确地将线程(用户)数设置为 6。然后永远循环运行它(勾选它或将其放入 while 循环中)并添加一个侦听器,如聚合报告和结果树。您可以用来检查正确内容的结果正在发送和响应(假设您验证响应),并且在汇总报告中,您可以看到每小时发生的每个活动的数量(显然乘以 3600 秒,但是由于这种不准确,最好运行一段时间)。

现在可以运行初始负载测试,作为更准确的测试,您可以让它运行更长时间(浸泡测试),以查看是否出现任何其他问题 - 缓冲区溢出、内存泄漏或其他意外事件。

【讨论】:

【参考方案3】:

使用Throughput Shaping Timer

【讨论】:

【参考方案4】:

我遇到了类似的问题,这里有两个我找到的解决方案:

解决方案 1: 您可以在其中使用带有恒定吞吐量计时器的步进线程组(允许在设定的时间段内设置线程数增加阶段)。 吞吐量计时器允许您设置线程每分钟可以发送的样本数(例如,如果您将其设置为 1,则线程每分钟只会发送一个请求)。此外,您可以将吞吐量计时器应用于线程组中的所有线程,或者为每个线程设置具有自己设置的计时器。 在此处阅读有关吞吐量计时器的更多信息:https://www.blazemeter.com/blog/how-use-jmeters-throughput-constant-timer

解决方案 2: 使用“设置线程组”。您可以计算线程数和加速时间以获得所需的每秒线程数。

【讨论】:

【参考方案5】:

您可以使用Schedule Feedback Function,并且还需要并发线程组

【讨论】:

【参考方案6】:

同样可以通过在 UI 中配置“ConstantThroughputTimer”来完成,也可以通过右键单击 Thread Group 导航添加“ConstantThroughputTimer”,然后单击 Timer,然后选择“Constant Throughput Timer”。

【讨论】:

以上是关于使用 JMeter 进行测试:如何每秒运行 N 个请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jmeter进行接口测试

如何使用jmeter做webservices接口测试

Jmeter-基础实战

Jmeter的使用

性能测试工具 wrk,ab,locust,Jmeter 比较

调整Apache Jmeter以提高请求吞吐量