如果我不断增加线程数,平均响应时间如何保持或多或少不变?
Posted
技术标签:
【中文标题】如果我不断增加线程数,平均响应时间如何保持或多或少不变?【英文标题】:How can the average response time remain more or less constant if I keep increasing the number of threads? 【发布时间】:2021-12-09 22:20:52 【问题描述】:我有一个运行 2 小时的简单压力测试场景。我已经配置了 3000 个线程,以便在整个测试期间进行加速。 这只是一个重复多次的 HTTPS POST 请求,每次请求都会更改 json 正文数据。客户端在一个系统上,而服务器在另一个系统上。我只是用一些输入数据调用一个 API,该 API 在文件中查找数据并用硬编码的任何内容进行响应。
怎么可能虽然我随着时间的推移不断增加线程数,但系统上的负载却没有成比例地增加?
我问这个是因为几天前在做这个测试时,平均响应时间随着我的线程(虚拟用户)的增加而成比例地增加。现在,在进行相同的测试时,这种增加不再发生 - 这就是为什么现在我猜测开发人员已经设置了一些最大 TPS 限制。
这是随时间变化的响应时间结果:
这是总 TPS:
随着时间的推移活动线程结果:
随时间推移的字节吞吐量:
有人可以帮我理解这怎么可能吗?没有错误代码。
似乎服务器以某种方式限制了客户端,但我不明白通过哪种机制,也不知道哪个 jmeter 结果图会向我显示更清晰的证据。 如果有人能帮助我理解,我将不胜感激。
【问题讨论】:
我不清楚您的测试设置是什么样的(客户端和服务器在同一系统上,不同的系统,服务器甚至对每个请求都做了什么......)但我建议服务器不是限制性能的原因。相反,每个请求都有或多或少的恒定延迟,这不是由服务器引起的,而是由设置和测试类型引起的。例如,一个 HTTP 请求从开始到结束需要多次往返,如果每个请求都是在新的 TCP 连接中完成的,甚至使用 TLS 更是如此。无论服务器有多快,这种延迟都会限制性能。 @SteffenUllrich 这只是一个重复多次的 HTTPS POST 请求,每个请求都会更改 json 正文数据。客户端在一个系统上,而服务器在另一个系统上。无论如何,我只是在调用一个 API。我问这个的原因是几天前在做这个测试时,平均响应时间随着我的线程(虚拟用户)的增加而成比例地增加。现在在进行相同的测试时,这种增加不再发生,这就是为什么现在我猜测开发人员设置了一些最大 TPS 限制...... 这种上下文(它做了什么,它上次的表现如何 - 但请提供实际数字)应该是问题的一部分,而不是隐藏在评论中。此外,“调用 API”可能意味着只是回显数据、进行昂贵的数据库备份、联系其他系统以收集数据...... - 所有这些都会以不同的方式影响性能。如果没有这些关键信息,我们只能疯狂地推测这里的限制。 谢谢。我根据您的建议更新了问题。您可以在图片中看到数字。我没有以前运行的数据。如果您认为我可以提供任何其他信息,请告诉我。我猜一些推测也可以帮助我。 【参考方案1】:您显示的是不同测试执行的结果,因此我们无法正确关联它们,即响应时间从 23:15
开始,其他 2 个图表以 23:01
结束。
一般来说,性能良好的系统的吞吐量应该与增加的负载成比例地增加。如果它没有发生 - 应该对此进行解释,即
-
响应时间增加,请尝试查看
22:23
和23:01
之间的响应时间
JMeter 发送请求的速度不够快,请确保遵循 JMeter 最佳实践并使用 JMeter PerfMon Plugin 监控负载生成器资源,如 CPU、RAM 等
由于配置或实施限制,应用程序无法足够快地响应,请使用 APM 或 Profiler 工具检查 API 调用背后的情况
JMeter 不报告错误的事实并不一定意味着没有错误,您的应用程序可能会以HTTP Status Code 200 响应,但正文包含错误详细信息,因此查看即Bytes Throughput Over Time 图表是有意义的查看传输的数据量是否随着用户的到达而增长。您还可以考虑将Assertions 添加到您的请求中,以确保您的测试正在做它应该做的事情
【讨论】:
谢谢迪米特里。关于图表,这是我的错误,对不起。我现在已经用相同执行的结果更新了问题内容。现在所有图表都从 23:15 开始。我一定会查看您提供的链接。与往常一样,您的观察和回答都很棒!【参考方案2】:此问题可能是由于客户端限制了实际执行的线程数。换句话说,线程可能在负载生成器上排队。有关详细说明,请参阅 Dr. Gunter How to Get Unbelievable Load Test Results,特别是 4.4 节流的线程 部分。该论文展示了一种使用利特尔定律来估计实际执行的线程数的方法。
【讨论】:
以上是关于如果我不断增加线程数,平均响应时间如何保持或多或少不变?的主要内容,如果未能解决你的问题,请参考以下文章