分布式压力测试工具Locust在Rainbond上的部署

应用介绍

locust_logo

Locust是易于使用的分布式用户负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户。
Locust完全基于事件,因此可以在一台计算机上支持数千个并发用户。与许多其他基于事件的应用程序相比,它不使用回调。相反,它通过gevent使用轻量级进程。并发访问站点的每个Locust(蝗虫)实际上都在其自己的进程中运行(正确地说,是Greenlet)。这使您可以在Python中编写非常有表现力的场景,而不会使回调复杂化代码。

官方网址
官方文档

快速安装

Locust集群版已经发布到了Rainbond公有应用市场,供所有用户在线一键安装。

安装完成后,您将会得到一个Locust主从集群,其中,master组件负责提供UI界面,和并发任务的调度;slave组件负责执行并发任务,slave组件支持横向伸缩。也就是说,当您觉得Locust已经无法产生更大的并发,没有触碰到被压测站点的瓶颈时,请大手一挥,扩展多个实例。像下面这样:

如何使用

locust_master的8089端口提供了一个基于WEB-UI的图形化管理界面,首次登陆,会提示输入一些信息:

  • Number of total users to simulate:填写模拟的并发用户数量,图中所示并发用户为100。实际上,经过测试,单个slave实例可以轻松提供上千个用户并发的压力
  • Hatch rate:填写“蝗虫”的孵化率,图中所示每秒产生10个用户
  • Host:填写想要压测的站点地址,切忌加好协议头,即“http://”

仅有并发信息和主机信息还不够,我们需要定义用户访问Host之后的行为。

Locust通过一个名为 /locustfile.py 的Python脚本来定义用户行为,并且提供了专门的知道来教学如何写作一个Locust文件

在这里,提供一个简单的示例,来简要说明 Locust 如何模仿用户行为。


from locust import HttpLocust, TaskSet, task, between

class MyTaskSet(TaskSet):
    @task(2)
    def index(self):
        self.client.get("/")

    @task(1)
    def about(self):
        self.client.get("/about/")

class MyLocust(HttpLocust):
    task_set = MyTaskSet
    wait_time = between(5, 15)

这个脚本将按照顺序模仿以下行为:

  1. 请求Host的 / 路径两次
  2. 请求Host的 /about/ 路径一次
  3. 每次执行任务之间,间隔5-15秒

之所以要这么设计的原因,是Locust的设计者们认为,真正的用户行为,不会像脚本一样接连不断的执行完所有的请求然后退出。更多的情况是,用户做完一件事后,会停顿一会,比如读读说明,思考下一步要干嘛。所以会在每个步骤之间留下一个随机时长的空白期。这种假设实际上更符合用户实际行为。

这个文件,将会以配置文件的方式挂载到locust_master组件上,并且共享挂载给所有的locust_slave组件。这意味着,如果你想要更改这个文件的内容,只需要去编辑 locust_master 组件中,环境配置下所挂载的配置文件即可。然后更新整个 Locust 集群即可生效。

结果分析

借助Locust提供的WEB-UI界面,我们可以非常方便的分析压力测试结果。

Statistics页面,将向我们展示所有被压测接口的汇总报告。结果包括:

请求总数、失败次数、中位数响应时间、90%请求响应时间、平均响应时间、最小响应时间、最大响应时间、请求的平均大小、当前吞吐率、当前错误率。

Charts页面将主要结果绘制成为随时间变化的图表,能够在趋势上给于用户指引。

除了这些之外,还有几项值得关注的值会在最上面一排全局展示,包括当前请求的主机域名、当前产生的并发用户数量、slave节点数量、当前所有请求接口的总吞吐率、错误率。以及停止测试的按钮。

其它的几个页面会提供请求失败的接口及失败原因(Failures)、测试中意外的错误以及错误原因(Expections)、csv格式的测试数据下载地址(Download Data)、 所有slave实例的信息(Slaves)。

所有的数据都基于图形展示,十分方便。

应用制作

Locust集群应用的制作,完全依照官方提供的集群方式搭建。镜像均使用官方提供的 locustio/locust:latest 在master组件和slave组件之间,区别只在于环境变量赋值不同:

  • locust_master:
    • LOCUST_MODE = master 该环境变量指定了组件在集群中的角色
    • TARGET_URL = http://127.0.0.1:8089 这个环境是提供一个默认的 Host,可以在WEB-UI中修改
  • locust_slave:
    • LOCUST_MASTER_HOST = 127.0.0.1 指定了master组件的地址
    • LOCUST_MODE = slave 该环境变量指定了组件在集群中的角色
    • LOCUST_OPTS = --no-web slave节点不需要开启WEB-UI服务

指定完环境变量后,需要建立slave指向master的依赖关系,来提供二者之间的通信。

在 master组件编写配置文件 /locustfile.py ,在slave组件挂载它。

1 Like