确定 master 的理想工人数量和 EC2 大小
determine ideal number of workers and EC2 sizing for master
我需要在 10 分钟的测试中使用 Locust 模拟 20,000 个(或更多)用户 window。
locustfile 是 9 个 API 调用的任务序列。我正在尝试确定理想的工作人员数量,以及应将多少工作人员附加到 AWS 上的 EC2。我的测试显示有 20 个工作人员,在两个 EC2 实例上,CPU 负载是最小的。然而,主人却遭受了很大的痛苦。一个 4 CPU 16 GB RAM 的系统,因为 master 最终颠簸到 worker 开始打印这样的消息:
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/INFO/locust.util.exception_handler: Retry failed after 3 times.
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/ERROR/locust.runners: RPCError found when sending heartbeat: ZMQ sent failure
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/INFO/locust.runners: Reset connection to master
随着每个 Locust 主进程都增长到 12GB 虚拟 RAM,主进程似乎内存耗尽。好的 - 所以 EC2 有问题。但如果我需要测试 20,000 个用户,地球上是否有足够大的机器来处理这个问题?或者我需要采取不同的方法吗?如果需要,推荐的方向是什么?
标题中问题的答案是:"It depends"
您的 post 有点令人困惑。你说你有 10 个主流程?为什么?
这个问题很可能与 master 完全无关,因为它不关心下载的大小(这似乎是您的测试用例与大多数其他 locust 测试之间的唯一区别)
有一些可能有用的一般提示:
- 切换到 FastHttpUser (https://docs.locust.io/en/stable/increase-performance.html)
- 监控您的网络使用情况(如果您的负载生成器已经将其带宽最大化或 CPU 那么您的测试无论如何都是非常不现实的,并且添加更多用户只会增加噪音。一般来说,从低开始并且努力向上)
- 增加负载生成器的数量
一般来说,用户数量对 Locust 不是问题,但每秒请求数或带宽可能是。
在我的具体案例中,其中一个步骤是从 CloudFront 下载文件,该文件是在其中一项任务中随机选择的。这意味着尝试下载文件的 cloudFront 打开的连接越多,可用网络就越拥挤。
因为应用客户端实际上是手机上的原生应用,而且影响每个手机下载速度的因素很多,所以我决定从 GET 请求切换到 HEAD 请求。这让我可以测试来自 CloudFront 的响应时间,其中分布受到 Lambda@Edge 函数的保护,该函数使用测试早期的数据对用户进行身份验证。
这样做会显着改善负载测试结果,并且不会人为地扭曲其他测试,如带宽或系统资源耗尽,其他所有测试都会受到负面影响。
使用这种方法,我在十分钟 运行 时间内成功执行了 10,000 个用户测试。我使用了 4 个 EC2 T2.xlarge 实例,每个 T2 有 4 个工人。测试计划中的 9 个任务产生了将近 750,000 URL 次调用。
我需要在 10 分钟的测试中使用 Locust 模拟 20,000 个(或更多)用户 window。
locustfile 是 9 个 API 调用的任务序列。我正在尝试确定理想的工作人员数量,以及应将多少工作人员附加到 AWS 上的 EC2。我的测试显示有 20 个工作人员,在两个 EC2 实例上,CPU 负载是最小的。然而,主人却遭受了很大的痛苦。一个 4 CPU 16 GB RAM 的系统,因为 master 最终颠簸到 worker 开始打印这样的消息:
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/INFO/locust.util.exception_handler: Retry failed after 3 times.
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/ERROR/locust.runners: RPCError found when sending heartbeat: ZMQ sent failure
[2020-06-12 19:10:37,312] ip-172-31-10-171.us-east-2.compute.internal/INFO/locust.runners: Reset connection to master
随着每个 Locust 主进程都增长到 12GB 虚拟 RAM,主进程似乎内存耗尽。好的 - 所以 EC2 有问题。但如果我需要测试 20,000 个用户,地球上是否有足够大的机器来处理这个问题?或者我需要采取不同的方法吗?如果需要,推荐的方向是什么?
标题中问题的答案是:"It depends"
您的 post 有点令人困惑。你说你有 10 个主流程?为什么?
这个问题很可能与 master 完全无关,因为它不关心下载的大小(这似乎是您的测试用例与大多数其他 locust 测试之间的唯一区别)
有一些可能有用的一般提示:
- 切换到 FastHttpUser (https://docs.locust.io/en/stable/increase-performance.html)
- 监控您的网络使用情况(如果您的负载生成器已经将其带宽最大化或 CPU 那么您的测试无论如何都是非常不现实的,并且添加更多用户只会增加噪音。一般来说,从低开始并且努力向上)
- 增加负载生成器的数量
一般来说,用户数量对 Locust 不是问题,但每秒请求数或带宽可能是。
在我的具体案例中,其中一个步骤是从 CloudFront 下载文件,该文件是在其中一项任务中随机选择的。这意味着尝试下载文件的 cloudFront 打开的连接越多,可用网络就越拥挤。
因为应用客户端实际上是手机上的原生应用,而且影响每个手机下载速度的因素很多,所以我决定从 GET 请求切换到 HEAD 请求。这让我可以测试来自 CloudFront 的响应时间,其中分布受到 Lambda@Edge 函数的保护,该函数使用测试早期的数据对用户进行身份验证。
这样做会显着改善负载测试结果,并且不会人为地扭曲其他测试,如带宽或系统资源耗尽,其他所有测试都会受到负面影响。
使用这种方法,我在十分钟 运行 时间内成功执行了 10,000 个用户测试。我使用了 4 个 EC2 T2.xlarge 实例,每个 T2 有 4 个工人。测试计划中的 9 个任务产生了将近 750,000 URL 次调用。