Locus介绍
Locust是一个易于使用,可编写脚本且可扩展的性能测试工具。
使用常规Python代码定义用户的行为,而不是使用笨拙的UI或特定于域的语言(DSL)。
这使得Locust可以无限扩展,并且对开发人员非常友好。
在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IO和coroutine来实现网络层的并发请求,因此即使是单台 压测机器,也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,Locust能在使用较少压力机的前提下支持极高并发数的测试。
Locust具有用户友好的Web界面,可实时显示测试进度和测试结果。
Locus安装
Locus的安装地址如下:Locus安装。最新版的Locus(1.5.1)需要Python3.6以上。
简单示例
一个测试Web接口的例子如下:
import msgpack
from locust import HttpUser, task, between
class GamePlayer(HttpUser):
wait_time = between(0.1, 0.2)
@task(1)
def get_players_info(self):
body = {
"hostnum2pids": {65001: ["YJZM6Ov5QQtwYZJX"]},
"fields": [],
}
data = msgpack.packb(body)
self.client.post("/redis_player/get_players_info", data=data)
@task(3)
def set_player_info(self):
body = {
"pid": "YIDjvlHpKkIpDcpE",
"info": {'head': {'head': 1}, 'base': {'school': 1}}
}
data = msgpack.packb(body)
self.client.post("/redis_player/set_player_info", data=data)
Locus用一个HttpUser对象,管理客户端的行为。
字段wait_time表示连续两个行为之间的时间间隔。如果没有定义该字段,则在一个行为结束时,立刻执行下一个行为。
修饰符@task定义每个客户端需要执行的任务。参数表示任务的权重。如上述两个任务权重分别为1、3,则两个任务被执行的比例为1:3。
运行
- 如果启动的locust文件名为locustfile.py并位于当前工作目录中,可以直接执行如下命令:
locust
- 如果Locust文件位于子目录下且名称不是locustfile.py,可以使用-f命令启动上面的示例locust文件:
locust -f filepath/filename.py
- 如果要运行分布在多个进程中的Locust,通过指定-master以下内容来启动主进程 :
locust -f filepath/filename.py --master
- 如果要启动任意数量的从属进程,可以通过-salve命令来启动locust文件:
locust -f my_locustfile.py --worker --master-host=192.168.0.14
- 采用docker-compose形式执行:
- 在
locustfile.py所在目录,编写docker-compose.yml文件
version: '3'
services:
master:
image: locustio/locust
ports:
- "8089:8089"
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --master -H http://master:8089 --web-host=0.0.0.0
worker:
image: locustio/locust
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --worker --master-host master
- 在
locustfile.py所在目录,执行docker-compose目录
docker-compose up --scale worker=2
结果展示
Locust通过WebUI的形式,展示压测结果。原版的统计结果,包括了常见的平均响应时间、每秒请求次数、响应时间百分位数。
可以在原来基础上,方便地进行二次开发。