使用每秒预定义请求数的Locust [英] Using Locust with pre-defined requests per second

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

问题描述

查看负载测试工具时,我发现了Locust,并立即发现它作为一个使用Python的人很有吸引力,但我不能完全确定我是否能用它实现以下场景...

我的任务是使用真实流量对REST API进行负载测试。我已经从生产Apache日志中提取了相当于5分钟的GET流量,其想法是使用负载测试工具以相同的时间分布(在每秒1到36个请求之间)运行这些相同的请求。为此,我构建了一个Python字典,其中相对时间戳(xx:xx,即mins:secs)为键,值为在该秒请求的URL路径列表。

我们将某个时间点的生产数据库转储恢复到我们的测试环境中,请求来自转储创建后的下一个五分钟。在两次测试运行之间,我更改了rest API连接到数据库的方式的参数,因此测试运行需要尽可能相同,以使指标具有可比性。

我已经查看了Locust文档中的自定义负载形状,它们似乎可能起作用,但我不敢肯定。自定义tick方法实现可以做到这一点吗:

在0秒时,发出一组4个请求。
在%1秒内,发出一组%2个请求。
在%2秒内,发出一组12个请求。
随着时间的推移,每秒都会发生一组预定义的请求...
在4分59秒内,发出一组27个请求。
在5分钟内提出一组14个请求。

这个地图将如何映射到蝗虫的能力?产生多少用户并不重要,重要的是发出了多少请求,以及在哪个时间点。

我真的很喜欢Locust的易用性和熟悉的语法,但它适合使用这样的静态、可重复的请求负载进行测试吗?

编辑:由于这种方法似乎不可能在没有很大困难(或根本不)的情况下实现,我提出了另一种方法,其差异足以保证一个单独的问题:Getting Locust to send a predefined distribution of requests per second

推荐答案

简而言之,没有。Locust的核心是运行一定数量的用户,这些用户彼此之间相当独立。

您可以使用wait_time = constant_throughput(x)(https://docs.locust.io/en/stable/writing-a-locustfile.html#wait-time-attribute)控制每个用户的吞吐量。您还可以查看面向全球吞吐量(https://github.com/SvenskaSpel/locust-plugins/blob/master/examples/constant_total_ips_ex.py)的Locust-pluginsconstant_total_ips

但是,如果您要在准确的时间执行确切的数量的请求,我认为没有现成的可用的服务。

您可以在触发请求之前使用Python同步所有用户。我没有一个很好的解决方案,但这种方法是可行的(您需要运行10个用户,否则会遇到并发问题--我敢肯定有更好的解决方案)

users_waiting = 0
lock = Semaphore(10)
...
    @task
    def t(self):
        global users_waiting
        with lock:
            users_waiting = users_waiting + 1 if users_waiting < 10 else 1
            while self.environment.runner and users_waiting < 10:
                time.sleep(0.1)
            # actually do your requests here

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

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