【问题标题】:Load test - need to run a test that mimics 100K users负载测试 - 需要运行模拟 10 万用户的测试
【发布时间】:2014-08-15 16:47:38
【问题描述】:

我们需要对我们的服务器进行负载测试,我们的目标是模拟 10 万并发用户。 我创建了一个 junit 脚本,它接收 NUM_OF_USERS 参数并针对我们的服务器运行该脚本。

问题是我们需要大量用户 (100K),而运行此测试的单台电脑可能只能处理 1000 个用户。

我们如何才能完成这项任务?有什么工具吗?

PS - 如果我们可以从多台电脑上运行这个 junit 测试,而不是使用需要配置相关参数的工具,那就太好了。(我们花了很多时间创建这个脚本,并希望避免过渡到不同的工具)

【问题讨论】:

标签: java junit load


【解决方案1】:

您可以理解,打开 100K 线程是不可能的。但是,您实际上并不需要 100K 线程。人类用户的行动相对较慢。每 10 秒执行最大操作或类似的操作。

因此,您可以创建大概 100 个线程,但每个线程应该模拟 1000 个用户。如何模拟?您可以持有 1000 个代表用户状态的对象,按顺序或随机进入列表,执行下一个用户的操作并执行它。

您可以自己实现它或使用 Actors 模型框架,例如Akka.

如果您现在不想使用 Akka,您可以使用 JMeter 改进第一个解决方案。您可以为 JMeter 实现插件,您可以在其中使用在一个线程中模拟多个用户的相同逻辑,但线程池将由我的 JMeter 管理。作为一项好处,您将获得报告、时间测量和可配置的负载。

【讨论】:

  • 你的方法有问题,因为我的测试是创建一个用户正在执行的休息调用,现在的问题是每个这样的调用都是阻塞的(使用restTemplate),所以这里不是真正的并发跨度>
  • 可以将此方法与休息调用一起使用。 REST 调用需要多长时间? 0.1 秒? 0.5 秒?一个用户每分钟点击多少次? 5? 10?让我们以 min-max 为例:用户每分钟点击 10 次,每次点击需要 0.5 秒。因此,您每分钟 IO 5 秒被阻塞,因此 1 个线程可以模拟 12 个用户。但这是最糟糕的情况。如果用户执行 5 次点击,每次点击耗时 0.1 秒,每个线程可以模拟 120 个用户,因此您需要大约 800 个线程。 BTW JMetter 可以帮助您分发呼叫。我的另一个建议 - Akka 使用 NIO,所以一个线程可以服务很多用户。
【解决方案2】:

您无需模拟 10 万用户即可大致了解 10 万用户的性能。由于您的模拟不会完全模仿真实用户,因此您已经接受了一些不准确之处,那么为什么不更进一步呢?

您可以使用 100、300 和 1000 个模拟用户(您说您的计算机可以管理)来衡量性能,并查看趋势。也就是说,您可以创建一个性能模型,并使用该模型通过外推来估计性能。计算成本(例如 CPU 时间或内存)可以通过幂律来近似:

C = C0 N^p

其中 C 是成本,C0 是未知成本常数,N 是问题规模(用户数量,对于您的case) 并且 p 是一个未知数(可能在 0 到 2 的范围内)。

【讨论】:

  • raedwald - 是否有任何链接指向有关该近似值的更详细信息?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多