JMeter 发送的请求少于预期

JMeter sending less requests than expected

我正在使用 jmeter 生成性能测试,为了保持简洁明了,我从 json 文件中读取初始数据,我有一个线程组,在读取数据后我随机化了该线程组某些值以防止在我需要时重复数据,然后我使用变量将最终数据传递到端点,这将最终出现在端点收到的 json 主体中,它基本上会生成一个新的数据库中的事务。我还添加了一个常量计时器以在请求之间添加 7 秒的延迟,测试持续时间为 10 分钟并且没有增加,我这样计算每秒的请求数:

1 分钟有 60 秒,我每个请求有 7 秒的延迟,那么我每分钟发送大约 8.5 个请求是合乎逻辑的,这是我的计算结果 (60/7) = 8.5 现在如果测试持续 10 分钟,那么我乘以 (8.5*10) = 85,在 10 分钟内得到总共 85 个事务,所以我应该能够在测试完成后看到在数据库中创建的完全相同数量的事务。

当我 运行 有 10-20-40 个用户时,这是正确的,在负载测试后 运行 我查询数据库,但是我得到完全相同的交易数量,因为我增加了线程组中的用户,这不再发生了,例如,如果我设置 1000 个用户,我应该能够在 10 分钟内生成 8500 个事务,但事实并非如此,数据库只创建大约 5.1k 个事务。

发生了什么事,出了什么问题?为什么它最初按预期工作,而当我增加用户时却没有?如果需要,我可以提供更多信息。请帮忙。

你能检查一下 jmeter 负载生成器的 CPU 和内存利用率(RAM 和 java 堆利用率)而 运行 1000 个用户的 jemter 吗?如果它更高或达到最大值,则可能会影响 requests/sec。也只是为了从 Jmeter 方面确认 requests/sec,你能在 Jmeter 脚本中添加监听器来跟踪 Hit/sec 或 TPS 吗?

如果您的 API 响应时间为 1 秒并且您为这 1000 个用户提供了足够的启动时间,这也将是正确的(10 分钟测试持续时间内有 8.5K 个请求)。

所以可能的原因是:

  • 您没有为 1000 个用户提供足够的启动时间。
  • 当您为 1000 个用户执行测试时,您的 API 平均响应时间超过 1 秒。

可能的解决方法:

  • 首先,尝试测量 1 位用户的 API 响应时间。
  • 然后据此计算10分钟达到8500请求需要多少用户。使用这个公式:

    TPS* max response time in second

  • 为 1000 个用户提供适当的启动时间。检查 以了解应如何计算加速时间。

  • 检查您的负载生成器是否能够在没有任何内存或运行状况(即 CPU 使用)问题的情况下生成 1000 个用户。如果需要,尝试使用分布式架构。

这可能有 2 个可能的原因:

  1. 您发现您的应用程序 bottleneck. When you add more users the application response time increases therefore throughput decreases. There is a term called saturation point 代表系统的最大性能,如果您超过这一点 - 系统响应速度将变慢,您获得的 TPS 将低于最初。从被测应用程序方面,您应该查看以下方面:

    • 您的应用程序可能只是缺少资源(CPU、RAM、网络等),请确保它有足够的空间来运行,即 JMeter PerfMon Plugin
    • 您的应用程序中间件(应用程序服务器、数据库、负载平衡器等)没有针对高负载进行正确设置。确定您的应用程序基础架构堆栈,并确保每个组件都遵循 performance tuning guidelines
    • 您的应用程序代码也可能需要优化,您可以使用 profiling tools [=33] 检测最多 time/resource 消耗函数、最大对象、最慢的数据库查询、空闲时间等=]
  2. JMeter 发送请求的速度不够快