【问题标题】:Simulate millions of users with JMeter使用 JMeter 模拟数百万用户
【发布时间】:2014-06-11 17:25:31
【问题描述】:

我的系统应该能够同时处理数百万用户的请求。为了检查系统如何处理负载,我设置了一组 JMeter 服务器(从属)和一个控制器(客户端)。

我有一个包含所有用户 (~10M) 的数据库,我需要发送来自不同用户的每个请求。

我想知道如何在 JMeter 中实现这样的事情。基本上,我考虑过为每个从站划分一个用户范围(比如说 100,000),然后在给定的从站内,每个请求都应该从本地 100,000 列表中读取一个新用户,然后将其删除。因此,我最终会向每个用户发送一个请求。

问题是,虽然这个想法在理论上听起来合乎逻辑,但我并不完全知道如何使用 JMeter 术语来实现它。另外,我不确定如何在测试中从数据库中读取数据,尽管理论上我可以提前将其读取到文本文件中,并让每个从站包含该文本文件及其 100,000 个用户部分。

我可以设置一个非常大的机器集群,所以这里的规模不是问题。只是如何设置它。

【问题讨论】:

  • 为什么不在云上尝试负载测试?不同的工具用于相同的目的。
  • 实际上,JMeter 集群在 Google Compute Engine 上运行... :-) 问题是我不确定如何分配用户:1. 从属之间 2. 在每个从属内,在线程之间.此外,如果您知道其他(云)工具可以更好地做到这一点,请告诉我哪个..
  • blazemeter,tlaloc(我的团队使用 tlaloc)
  • 至少对于 blazemeter,超过 1,000,000 个并发用户每月将花费我 >1000 美元,用于企业计划。目前,我处于原型阶段,所以我现在想坚持免费的解决方案。

标签: jmeter load-testing


【解决方案1】:

为 Jmeter 提供参数列表的最佳方法是使用 CSV 文件: http://jmeter.apache.org/usermanual/component_reference.html#CSV_Data_Set_Config 您可以配置 CSV 数据集配置以使每个线程使用 CSV 中的不同行。每个引擎都需要有自己独特的 CSV 文件,因为共享模式在分布式测试中的引擎之间不起作用(您可以尝试自动化这部分,这样做会很有趣:))。

你的脚本应该是这样的:
1. 线程组
1.1 HTTP 采样器(登录)
1.1.1 CSV 数据集配置
1.2 秒 http 采样器
等等……

登录采样器将使用从 CSV 文件加载的参数,因此每次“登录”都会使用不同的行。

分布式测试非常简单: http://jmeter.apache.org/usermanual/remote-test.html 请记住,在单个 Jmeter 负载引擎上运行 100K 并发用户会很困难(Jmeter 会消耗服务器上的资源,因此您将需要大量 CPU 和内存)。因此,您还应该监控引擎。 此外,100 万用户会导致引擎将大量数据发送回控制台,因此您可能需要并行启动一堆分布式测试,最后汇总结果。

干杯,

【讨论】:

  • 我需要可配置的数据是 json 对象,因为我在请求正文中发送 JSON。这也可以用 CSV 数据配置集来实现吗?
  • 目前没有可以读取 JSON 格式的配置元素。您可以使用 beanshell 脚本尝试将 JSON 文件格式化为参数。另一种选择是使用 HTTP 采样器“正文数据”选项,使用 CSV 中的参数构建 JSON 请求。
  • @Yaniv Donenfeld 您始终可以从 CSV 数据集 e.g. { "name": "${name}", "username": "${Uname}", "password": "${Pword}" } 更改 JSON 输入的值
【解决方案2】:

这可以通过执行以下步骤来实现:

  • 获取用户凭据转储并将其保存到 csv 文件中
  • 拆分 csv 文件。将 1 个文件复制到每个 Jmeter 从站,位于所有 Jmeter 从站的相同位置 机器"C:\Loadtest\"
  • 从控制器中,在“CSV 数据集配置”中提供 csv 文件的路径。
  • 运行测试。

通过执行上述步骤,Jmeter 控制器将通过指向所有 Jmeter Slave 节点来开始执行测试,以使用同一位置“C:\Loadtest\”中的 CSV 文件。 但这里的诀窍是所有机器都将使用不同的用户集。

希望这会有所帮助。

【讨论】:

  • 关于您的建议,我想确认一件事:在一台机器上,给定文件,例如:C:\LoadTest\usersXX.csv - 所有并行运行的线程会同时读取它吗?我需要每个用户只收到一次请求,所以这是一个需要消耗和清空的用户队列——这将如何工作?还是所有线程都会读取相同的数据?
  • 每台机器都将在本地访问该文件。即使所有机器上的文件名相同,数据也可以不同。所以每个从节点都会有自己的一组数据。为确保 1 个用户严格只发送 1 个请求,请确保线程/用户数小于或等于数据中的用户数。例如如果想在 10 个从节点上运行 1000 个并发用户的负载。控制器中的用户/线程应为 100。
  • 其实,我刚看到这篇文章:community.blazemeter.com/knowledgebase/articles/…,它解释了如何在每个节点具有不同文件名的工作人员之间分发文件。
  • 它将以相同的方式工作,唯一的变化是您可以为每个数据文件赋予不同的文件名。测试将不使用保存在控制器机器中的 CSV 数据文件。您必须将每个 Jmeter 从机中的文件保存在与控制器中定义的路径相同的路径中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多