使用 Locust 进行亚马逊 Kinesis 负载测试

作者: 路易斯·莫拉莱斯 | 2023 日

构建流数据解决方案需要对其在生产环境中运行的大规模进行全面测试。大规模运行的流媒体应用程序通常处理高达每秒 GB 的大容量,开发人员很难模拟高流量的 基于 Amazon Kinesis 的应用程序以轻松生成此类负载。

亚马逊 Kinesis Data Streams 和亚马逊 Kinesis Data Firehose 能够每小时捕获和存储来自多个来源的数太字节的数据。通过 亚马逊云科技 管理控制台 、 亚马逊云科技 命令行接口 (亚马逊云科技 CLI) 或 Kinesis API 可以直接创建 Kinesis 数据流或 Firehose 交付流。但是,生成连续的测试数据流需要自定义流程或脚本才能持续运行。尽管 Amazon Kinesis 数据生成器 (KDG) 为此提供了用户友好的用户界面,但它有一些限制,例如带宽限制和往返延迟增加。(有关 KDG 的更多信息,请参阅 使用全新 Amazon Kinesis 数据生成器 测试您的流数据解决方案 。)

为了克服这些限制,这篇文章介绍了如何使用现代负载测试框架 Locust 进行大规模负载测试,以便对流数据解决方案进行更全面的评估。

概述

该项目通过 Locust 向 Kinesis 发射温度传感器读数。我们通过 亚马逊云科技 云开发套件 (A WS CDK) 设置了 亚马逊弹性计算云 (亚马逊 EC2) Locust 实例,以对基于 Kinesis 的应用程序进行负载测试。您可以访问 Locust 控制面板来执行和观察负载测试,并通过 会话管理器 ( 亚马逊云科技 Systems Manager 的一项功能)进行连接以进行配置更改。下图说明了这种架构。

Architecture overview

在我们使用最大的推荐实例 (c7g.16xlarge) 进行测试时,该设置能够在按需容量模式下每秒向 Kinesis 数据流发射超过 100 万个事件,批次大小(每个 Locust 用户的模拟用户)为 500。您可以在这篇文章的后面找到有关这意味着什么以及如何配置负载测试的更多详细信息。

蝗虫概述

Locust 是一个开源、可编写脚本且可扩展的性能测试工具,允许您使用 Python 代码定义用户行为。它提供了易于使用的界面,使其对开发人员友好且具有高度可扩展性。凭借其分布式和可扩展的设计,Locust 可以同时模拟数百万用户,以模仿性能测试期间的真实用户行为。

每个 Locust 用户代表真实用户可能在您的系统上执行的场景或一组特定操作。使用 Locust 运行性能测试时,您可以指定要模拟的并发 Locust 用户数量,Locust 将为每个用户创建一个实例,允许您评估系统在不同用户负载下的性能和行为。

有关 Locust 的更多信息,请参阅 Locust 文档 。

先决条件

首先,请从 GitHub 存储库 克隆或下载代码 。

在本地测试

要先在本地测试 Locust,然后再将其部署到云端,你必须安装必要的 Python 依赖项。如果你不熟悉 Python,请参阅 自述文件 以了解有关入门的更多信息。

导航到 load- test 目录并运行以下代码:

pip install -r requirements.txt

要从本地计算机向 Kinesis 数据流发送事件,您需要拥有 亚马逊云科技 证书。有关更多信息,请参阅 配置和凭证文件设置 。

要在本地执行测试,请留在 load- test 目录中运行以下代码:

locust -f locust-load-test.py

你现在可以通过 http://0.0.0.0:8089/ 访问 Locust 控制面板。 输入 Locust 用户的数量、生成速率(每秒添加的用户)以及主机的目标 Amazon Kinesis 数据流名称。 默认情况下,它会部署可用于测试的 Kinesis 数据 流 DemoStream 。

Locust Dashboard-Enter details

要查看记录的生成事件,请运行以下命令,该命令仅过滤 Locust 和根日志(例如,没有 Botocore 日志):

locust -f locust-load-test.py --loglevel DEBUG 2>&1 | grep -E "(locust|root)"

使用 亚马逊云科技 CDK 设置资源

GitHub 存储库包含 亚马逊云科技 CDK 代码,用于创建负载测试所需的所有资源。这消除了出现手动错误的机会,提高了效率,并确保了长期配置的一致性。要部署资源,请完成以下步骤:

  1. 如果尚未下载,请使用以下命令将 GitHub 存储库克隆到您的本地计算机:
git clone https://github.com/aws-samples/amazon-kinesis-load-testing-with-locust
  1. 下载 并安装最新的 Node.js。
  2. 导航到项目的根文件夹,然后运行以下命令来安装最新版本的 亚马逊云科技 CDK:
npm install -g aws-cdk
  1. 安装必要的依赖关系:
npm install
  1. 运行 cdk bootstrap 来初始化您的 亚马逊云科技 账户中的 亚马逊云科技 CDK 环境。在运行以下命令之前,请替换您的 亚马逊云科技 账户 ID 和区域:
cdk bootstrap

要了解有关引导过程的更多信息,请参阅引导。

  1. 安装依赖项后,您可以运行以下命令来部署 亚马逊云科技 CDK 模板的堆栈,该堆栈将在 5 分钟内设置基础设施:
cdk deploy

该模板设置了 Locust EC2 测试实例,该实例默认为 c7g.xlarge 实例,在发布时,us-east-1 的价格约为每小时 0.145 美元。要找到最准确的定价信息,请参阅 Amazon EC2 按需定价。您可以在本文后面找到有关如何根据负载测试规模更改实例大小的更多详细信息。

必须考虑到,负载测试期间产生的费用不仅归因于 EC2 实例成本,还受到数据传输成本的严重影响。

访问 Locust 控制面板

你可以使用 AWS CDK 输出 k inesislocustLoadTestingStack.locustdas hboardurl 打开控制面板,例如 http://1.2.3.4:8089 来访问控制面板。

Locust 仪表板受密码保护。 默认情况下,它设置为用户名 locust-user 和密码 locust-dashboard-pw d。

使用默认配置,您每秒最多可以发出 15,000 个事件。 输入 Locust 用户的数量(乘以批次大小)、生成率(每秒添加的用户)以及 Host 的目标 Kinesis 数据流名称。

Locust Dashboard-Enter details

开始负载测试后,可以在 “ 图表 ” 选项卡上查看负载测试。

Locust Dashboard-Charts

您还可以通过导航到正在进行负载测试的数据流,在 Kinesis Data Streams 控制台上监控负载测试。如果您使用默认设置,请导航到 DemoStream 。在详细信息页面上,选择 “ 监控 ” 选项卡以查看载入的负载。

Kinesis Data Streams-Monitoring

调整工作负载

默认情况下,该项目为每个传感器生成随机温度传感器读数,格式如下:

{
    "sensorId": "bfbae19c-2f0f-41c2-952b-5d5bc6e001f1_1",
    "temperature": 147.24,
    "status": "OK",
    "timestamp": 1675686126310
}

该项目附带Faker,您可以使用它来调整有效载荷以满足您的需求。 你只需要更新 locust-load-test.py 文件中的 g enerate_sensor_reading 函数即可:

class SensorAPIUser(KinesisBotoUser):
    # ...

    def generate_sensor_reading(self, sensor_id, sensor_reading):
        current_temperature = round(10 + random.random() * 170, 2)

        if current_temperature > 160:
            status = "ERROR"
        elif current_temperature > 140 or random.randrange(1, 100) > 80:
            status = random.choice(["WARNING", "ERROR"])
        else:
            status = "OK"

        return {
            'sensorId': f"{sensor_id}_{sensor_reading}",
            'temperature': current_temperature,
            'status': status,
            'timestamp': round(time.time()*1000)
        }

    # ...

更改配置

首次部署负载测试工具后,您可以通过两种方式更改配置:

  1. 连接到 EC2 实例,进行任何配置和代码更改,然后重启 Locust 进程
  2. 在本地更改配置和加载测试代码,然后通过 cdk d eploy 将其重新部署

第一个选项可帮助您更快地在远程实例上进行迭代,而无需重新部署。后者使用基础设施即代码 (IaC) 方法,并确保您的配置更改可以提交到源代码控制系统。为了缩短开发周期,建议先在本地测试您的负载测试配置,连接到您的实例以应用更改,在成功实施后,将其编码为 IaC 存储库的一部分,然后重新部署。

Locust 在 EC2 实例上作为 系统 服务创建,因此可以使用 system ctl 进行 控制。 如果您想在不重新部署堆栈的情况下根据需要更改 Locust 的配置,则可以通过系统管理器连接到实例,在 /us r/local/load-test 上导航到项目目录,更改 loc ust.env 文件,然后通过运行 sudo systemctl restart l ocus t 来重启服务。

大规模负载测试

此设置能够每秒向 Kinesis 数据流发射超过 100 万个事件,批量大小为 500 个,c7g.16xlarge 上有 64 个辅助事件。

要使用 Locust 和 Kinesis 实现最佳性能,请记住以下几点:

  • 实例大小 -您的性能受底层 EC2 实例的约束,因此有关扩展的更多信息,请参阅 EC2 实例类型 。要设置正确的实例大小,您可以在 k inesis-locust-load-testing.ts 文件中配置实例大小。
  • 辅助服务器的数量 — Locust 受益于分布式设置。因此,该设置启动了一个初级系统来进行协调,并启动了多个辅助系统来完成实际工作。要充分利用内核,您应该为每个内核指定一个辅助内核。你可以在 locust. env 文件中配置这个数字。
  • 批量大小 — 由于切换 Locust 用户和线程的资源开销,每个 Locust 用户可以发送的 Kinesis 数据流事件数量受到限制。为了克服这个问题,你可以配置批量大小来定义每个 Locust 用户模拟多少用户。它们作为 Kinesis 数据流 put_ records 调用发送。你可以在 locust. env 文件中配置这个数字。

此设置能够每秒向 Kinesis 数据流发射超过 100 万个事件,批量大小为 500 个,在 c7g.16xlarge 实例上有 64 个辅助事件。

Locust Dashboard-Large Scale Load Test Charts

您也可以在 Kinesis 数据流的 “ 监控 ” 选项卡上观察到这一点。

Kinesis Data Stream-Large Scale Load Test Monitoring

清理

为了不产生任何不必要的成本,请运行以下代码删除堆栈:

cdk destroy

摘要

Kinesis已经因其易于使用而在构建流媒体应用程序的用户中广受欢迎。借助这种使用 Locust 的负载测试功能,您现在可以更直接、更快捷地测试工作负载。访问 GitHub 存储库 开始测试之旅。

该项目根据Apache 2.0许可证获得许可,可以根据需要自由克隆和修改它。此外,您可以通过通过 GitHub 提交问题或拉取请求来为项目做出贡献,从而促进测试生态系统的协作和改进。


作者简介

路易斯·莫拉莱 斯在数字原生企业担任高级解决方案架构师,以支持他们在云端不断重塑自我。他热衷于软件工程、云原生分布式系统、测试驱动开发以及代码和安全的所有方面


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。