【问题标题】:Jmeter multiple concurrent users in single thread groupJmeter单线程组中的多个并发用户
【发布时间】:2020-01-23 18:08:00
【问题描述】:

我有1 thread group,我用single HttpSampler 定义了100 threads1 Iteration。基本上我正在测试一个 GET API。

现在,Jmeter 应该启动 100 个线程,然后它们应该向我的具有 API 的服务器发出请求。服务器可以同时响应 100 个请求。所以,基本上在任何时候我都应该有 100 个并发。

但当我通过 Blazemeter 检查时,情况并非如此。我的最大用户数为 37,总用户数为 100,这意味着测试期间的最大并发数为 37。

这只有在 Jmeter 没有并行执行线程时才有可能。那么我错在哪里?

我希望所有线程在全部创建后并行执行并立即触发请求,以便 1 次迭代的最大并发数为 100。

【问题讨论】:

  • JMeter 在创建线程后立即触发请求,您将 Ramp Up 保持为 0,因此 JMeter 将尝试尽快创建线程并触发它,但没有我们指定 JMeter 的位置持有它或达到每秒 N 次命中。这就是您看到不需要的 Hits 的原因,但这是 JMeter 的行为。答案中提供了如何控制每秒的线程数和点击次数。
  • @SAIR 我保持上升为 0,但仍然没有同时触发所有 100 个请求
  • 是的,它不会与您的设置同时触发 100 个请求,请参阅答案部分。

标签: java jmeter performance-testing load-testing blazemeter


【解决方案1】:

如果您需要更多控制和准确性,请使用Ultimate Thread Group JMeter 插件(而不是常规线程组)

将启动线程数设置为 100,初始延迟为 0,启动时间为 0,保持时间为正,您的线程将最多容纳 100 个用户

一般示例:

如果您的计算机无法处理生成负载,您可能需要分布式测试设置

【讨论】:

  • 谢谢你的答案。但是,当通过 Blazemeter(分布式测试设置)运行时,我只能获得 37 个最大并发的原因是什么?不是所有线程一起创建并一起触发请求吗?另外,我想按迭代而不是按秒触发。
  • @BreakingBenjamin 线程一起创建,但操作系统会在线程之间进行上下文切换,因此它们可能不会同时提交请求,服务器也可能不会一次接受 100 个请求(或原始计算机)。尝试我或其他答案以获得更准确的线程数
  • 好的。如果我有 1 个线程组和 1 个用户和 1 个 HttpSampler,这次我将其设置为 5 分钟而不是迭代。现在,虚拟用户是否会继续触发请求 5 分钟并异步接收响应,或者它会触发请求,然后等待收到响应,然后再次触发请求 .. 像这样持续 5 分钟?
  • @BreakingBenjamin 等待收到响应
【解决方案2】:

不建议使用 Ramp-Up period 作为0

我认为您混淆了并发(与虚拟用户相关)和同时(与请求或采样器相关)。

要同时点击请求,请使用 Synchronizing Timer 作为请求的子项。它将暂停X 线程数,然后立即释放。在此之前,为了保持 100 个用户的并发性,请尝试相应地使用加速时间(即 10 秒)。因此,100 个用户在服务器上存活需要 10 秒,然后同时满足 100 个用户的请求。

您使用哪个线程组并不重要,但如果您将并发保持更长的时间(保持该并发),则使用 Ultimate Thread Group 或者您可以相应地使用循环计数。

如果你想进行尖峰测试,那么常规的线程组就可以了。但您必须记住,您的某些线程可能已经完成工作并被关闭,因此您不会看到预期的并发用户数。

以下是 1 分钟测试持续时间的示例屏幕截图(100 位用户启动时间 30 秒 + 保持加载时间 20 秒 + 10 秒停止时间)

终极线程组配置:

测试结果(一次 100 个请求):

测试结果(100 个并发用户)

希望能帮助你理解。

【讨论】:

    【解决方案3】:

    为此,您可以使用Synchronizing_Timer。将同步计时器添加为 GET 请求的子项。

    SyncTimer 的目的是阻塞线程直到 X 个 线程已被阻塞,然后立即全部释放。一种 SyncTimer 因此可以在不同的点创建大的即时负载 测试计划。

    其次,要在一段时间内保持每秒 100 个请求/每秒命中的恒定负载,您可以使用Throughput Shaping Timer。确保在线程组中相应地将循环计数添加到 Forever 和 Duration。

    【讨论】:

    • Thnx 的答案,但是如果我只使用线程组而不使用任何同步计时器,为什么我只能获得 37 个并发?所有线程不会一起创建并一起触发吗?如果是,那么最大并发数不会是 100 吗?
    【解决方案4】:

    JMeter 的作用如下:

    1. Thread Group 中指定的线程数在加速期间被启动
    2. 每个线程开始执行倒置的Samplers(或根据Logic Controllers
    3. 当线程没有更多的采样器可以执行或循环迭代时,它被关闭

    假设以上所有情况,您可能会遇到一些线程已经完成工作并被关闭而一些尚未启动的情况。如果需要,请查看JMeter Test Results: Why the Actual Users Number is Lower than Expected 文章以获得更全面的解释

    因此解决方案如下:

    • 在线程组级别提供更多“迭代”让您的用户循环,这样您将拥有 100 个并发用户
    • 如果您需要执行某种形式的Spike Testing 并且不想/不能增加循环次数,只需使用Synchronizing Timer,这样 JMeter 将暂停线程直到达到所需数量并准确释放它们同一时刻

    【讨论】:

    • 如果我在 1 个线程组中以 0 和编号 fo 线程为 100,如上图所示,那么 jmeter 不会立即创建所有线程?
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多