让 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=10
和 requests_per_second_diff=10
才能让 Locust 在一秒钟内启动所有 10 个用户。如果下一秒是 25,您将有 requests_per_second=25
和 requests_per_second_diff=15
。在 Load Shape 中,spawn_rate
也适用于减少用户数量。所以如果 next 是 16,requests_per_second=16
和 requests_per_second_diff=9
.
我之前问过
所以,我退后一步,将问题重新表述为您可能可以使用自定义负载形状来完成的事情,但我不确定如何做——因此出现了这个问题。
与上一个问题一样,我们有一个 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=10
和 requests_per_second_diff=10
才能让 Locust 在一秒钟内启动所有 10 个用户。如果下一秒是 25,您将有 requests_per_second=25
和 requests_per_second_diff=15
。在 Load Shape 中,spawn_rate
也适用于减少用户数量。所以如果 next 是 16,requests_per_second=16
和 requests_per_second_diff=9
.