让Locust每秒发送预定义的请求分布 [英] Getting Locust to send a predefined distribution of requests per second

查看:12
本文介绍了让Locust每秒发送预定义的请求分布的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我以前问过this question关于使用Locust作为向目标服务器传递静态的、可重复的请求负载的方法(五分钟内每秒n个请求,其中n是为每秒预先确定的),但确定这是不容易实现的。

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

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

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

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

问题是我还不能从用户计数和繁殖率而不是服务器接收的请求率来思考。

问题变成这样:

如何实现自定义加载形状的tick()方法,以使(user count, spawn rate)元组产生粗略知道的每秒请求数分布,并可能借助其他配置选项和插件?

推荐答案

您需要创建一个Locust用户,其中包含您希望它运行的任务(例如,发出您的http调用)。您可以定义time between tasks来控制每秒的请求数。如果您有一个任务是进行单个http调用并定义wait_time = constant(1),则大约每秒可以收到1个请求。蝗虫的spawn_rate是每秒的单位。由于您已经有了要复制的数据,并且数据间隔为1秒,因此您可以使用tick()方法创建一个LoadTestShape类,如下所示:

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。在负载形状中,spawn_rate也可用于减少用户数量。因此,如果Next为16,则requests_per_second=16requests_per_second_diff=9

这篇关于让Locust每秒发送预定义的请求分布的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆