背景

在一次机缘巧合下,公司刚好需要对一个服务进行性能测试,刚好也想用locust做一次性能测试,因此也有了这次的locust新手使用分享。

由于locust的团队一直在维护着locust,因此locust一直会有迭代升级。本文是基于locust-1.4.3版本,如果最新版本和本文的操作流程有所不同,请以官方最新版本为准。

这里奉上locust官方文档 https://docs.locust.io/en/stable/

Locust

介绍

locust,单词意思--蝗虫,当蝗虫来袭是有多可怕,想必大家都能想象到了。

locust就像它的名字一样,当启动它的时候,它就能像蝗虫般向请求对象发起“进攻”。

下载

pip install locust

基本用法

1.0 以后的版本

  1. 假设有一个接口/test需要进行性能测试,代码如下:
# test_pf.py

from locust import HttpUser, task, between


class TestTask(HttpUser):

    wait_time = between(0, 0.1)
    host = 'http://localhost.com'  # 参数可以不在程序中定义,可以在locust的Web页面输入

    @task  # task装饰器是locust识别蝗虫任务的标记,同时也可以作为任务和任务之间的权重设置
    def query_distribution(self):
        header = {"Content-Type": "application/json"}
        param = {"param":123}
        url = '/test'
        with self.client.post(url=url, headers=header, json=param, catch_response=True, timeout=10) as response:  # catch_response参数是否在Web页面展示response的日志
            if response.status_code == 200:
              	response.success()
           	else:
              	response.failure(response)
  1. 启动locust脚本

    locust -f test_pf.py

    如果有下面的信息,则表示启动成功

    >>> locust -f pf_distribution.py 
    local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
    local/INFO/locust.main: Starting Locust 1.4.3
    

    注意:locust默认启动端口为8089,启动前需要检查8089端口是否被占用

  2. 打开 http://0.0.0.0:8089 展示的是locust提供的UI页面,也就是设置并发数等参数的页面,同时也是观察系统性能数据的页面

  3. 打开页面后,就可以开心的对系统进行“攻击”了。

这里顺便介绍一下1.0以前的版本脚本写法

一些旧一点的版本,locust需要定义两个类才能启动,定义任务的类以及启动locust的类,而在新的版本中被官方合并,这里只是做一个普及,不做深入介绍。

from locust import HttpLocust, TaskSet, between, task


class TestTask(TaskSet):

    @task  # task装饰器是locust识别蝗虫任务的标记,同时也可以作为任务和任务之间的权重设置
    def query_distribution(self):
        header = {"Content-Type": "application/json"}
        param = {"param":123}
        url = '/test'
        with self.client.post(url=url, headers=header, json=param, catch_response=True, timeout=10) as response:  # catch_response参数是否在Web页面展示response的日志
            if response.status_code == 200:
              	response.success()
           	else:
              	response.failure(response)


class Test(HttpLocust):
    task_set = YieldSet
    host = ''   # 参数可以不在程序中定义,可以在locust的Web页面输入
    wait_time = between(0, 0.01)

高级用法

这里主要介绍的是locust的分布式启动方式,也就是locust 的master-slave模式。

什么locust会有一个分布式启动方式?究其原因,是locust默认使用的是单个CPU的系统资源。

加入有一台4核的服务器,如果使用locust -f test_pf.py启动locust脚本,locust只会调用一个核的能力,也就是这台服务器的CPU使用率最高也才25%,明白了这点,也就大概知道了locust的分布式启动是干什么用的。就是彻底使用服务器的所有资源来产生最大的压力。

locust分布式启动

  1. 启动master节点
locust -f pf_distribution.py --master
local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
local/INFO/locust.main: Starting Locust 1.4.3
  1. 启动slave节点
locust -f pf_distribution.py --worker
local/INFO/locust.main: Starting Locust 1.4.3
  1. 启动slave节点后,master节点会收到slave节点的启动日志
local/INFO/locust.runners: Client 'x-MacBook-Pro.local_1a01c69010bb48f5a79e7e802e98f10c' reported as ready. Currently 1 clients ready to swarm.
/INFO/locust.runners: Client 'wewen-MacBook-Pro.local_935f4c8dc5c14401b31c6961460fa833' reported as ready. Currently 2 clients ready to swarm.

当关闭master节点后,所有的slave节点都会自动关闭,反过来,关闭一个slave节点,master不会关闭,关闭所有slave节点都关闭后,master节点也不会关闭,它会继续挂起,等待slave节点启动。

locust命令行启动的更多用法,可以使用locust -h查询