让 Locust 每秒发送预定义的请求分布

Getting Locust to send a predefined distribution of requests per second

我之前问过 关于使用 Locust 作为向目标服务器传送静态、可重复请求负载的方法(每秒 n 个请求,持续五分钟,其中 n 是每秒预先确定的),并且确定它不容易实现。

所以,我退后一步,将问题重新表述为您可能可以使用自定义负载形状来完成的事情,但我不确定如何做——因此出现了这个问题。

与上一个问题一样,我们有一个 5 分钟的 Apache 日志提取周期,其中每秒向 Apache 服务器发出 1 到 36 个 GET 请求。从这些日志中,我可以获得特定每秒请求率出现的次数分布;例如在任何给定秒内有 1/4000 的机会处理 36 个请求,在任何给定秒内有 1/50 的机会处理 18 个请求,等等。

我可以将请求率的分布建模为一个简单的 Python 列表:1 到 36 之间的数字在其中出现的次数与每秒 1-36 个请求在 5-在 Apache 日志中捕获的分钟周期,然后在自定义负载形状的 tick() 方法中随机从中获取一个数字,以获取通知 (user count, spawn rate) 计算的数字。

此外,通过使用预先确定的随机种子,我可以使测试运行在可接受的变化范围内可重复,这有助于测试我的 API 服务器配置更改,因为相同的随机列表元素应该每次都被检索。

问题是我还不能“在 Locust 中思考”,无法根据用户数量和生成率而不是服务器收到的请求率来思考。

问题变成这样:

如何实现自定义负载形状的 tick() 方法,使 (user count, spawn rate) 元组导致 大致已知的每秒请求分布 发送,可能需要其他配置选项和插件的帮助?

您需要创建一个 Locust 用户,其中包含您希望它执行的任务 运行(例如,进行 http 调用)。您可以定义 time between tasks 来控制每秒的请求数。如果您的任务是进行单个 http 调用并定义 wait_time = constant(1) ,您每秒大约可以获得 1 个请求。 Locust 的 spawn_rate 是一个每秒的单位。由于您已经有了想要重现的数据,并且它的间隔为 1 秒,因此您可以使用 tick() 方法创建一个 LoadTestShape class,有点像这样:

class MyShape(LoadTestShape):
    repro_data = […]
    last_user_count = 0
    def tick(self):
        self.last_user_count = requests_per_second
        if len(self.repro_data) > 0:
            requests_per_second = self.repro_data.pop(0)
            requests_per_second_diff = abs(last_user_count - requests_per_second)
            return (requests_per_second, requests_per_second_diff)
        return None

如果您的第一个数据点是 10 个请求,您需要 requests_per_second=10requests_per_second_diff=10 才能让 Locust 在一秒钟内启动所有 10 个用户。如果下一秒是 25,您将有 requests_per_second=25requests_per_second_diff=15。在 Load Shape 中,spawn_rate 也适用于减少用户数量。所以如果 next 是 16,requests_per_second=16requests_per_second_diff=9.