一、Locust介绍
一个开源性能测试工具,使用 Python 代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统,方便、高效、可分布式等
二、工具安装
环境python3
pip install locust
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn locust
三、locust类库介绍
Locust官方文档
Httpuser类:就是用户行为的操作
Client方法:发送请求
Task类:任务控制的类,权重,跳过等
Taskset类:测试集类
On_start方法:类似于自动化中的setup,每个虚拟用户执行前都会执行这个方法
On_stop方法:类似于自动化中的teardown,每个虚拟用户执行结束后执行这个方法
@task装饰器,如果task后面带有数字,则代表的是测试集中的权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1
Between方法中的是休眠时间:会取between数值中间的随机数
Locust中还有其他很多类,我暂时没用到,有兴趣可以下去了解下,非常不错的一款性能工具
四、locust使用
Windows
我这里使用的是云服务器2c4g, 带宽:8Mbps
代码:以登录vsite网站来压吧 100并发
# coding=utf-8
"""
@Project :pachong-master
@File :test001.py
@Author :gaojs
@Date :2022/5/19 21:47
@Blogs : https://www.gaojs.com.cn
"""
from locust import HttpUser, between, task, TaskSet, tag
import os
# 强制去掉控制台InsecureRequestWarning
import urllib3
# 随机产生UA类库
from faker import Factory
urllib3.disable_warnings()
class TaskTest(TaskSet):
def on_start(self):
"""
description:每个用户执行压测之前都会获取随机数和数字签名
:return:
"""
# 每个用户执行压测之前都会获取随机数和数字签名
# print('====================清理log结束,压测开始, 获取随机数和数字签名!!!========================')
pass
# 压测任务,也可以是@task(10)啥的,这个数字是代表权重,数值越大,执行的频率就越高
@task
def stress_get(self):
"""
登录虚拟站点
:return:
"""
url = '/prx/000/http/localh/login'
data = {
"Content-Type": "application/x-www-form-urlencoded, charset=UTF-8",
'Connection': 'close',
"method": "method1",
"uname": "t",
"pwd1": None,
"pwd2": None,
"pwd": "t",
"submitbutton": "Sign In"
}
randon_ua = Factory.create()
ua = randon_ua.user_agent()
headers = {
'User-Agent': ua
}
rsp = self.client.post(url=url, headers=headers, data=data, verify=False, allow_redirects=False, name='loginVsite压测')
# print(rsp.status_code)
print(rsp.text)
assert rsp.status_code == 302
# 执行并发测试后执行的动作,比如保存log等操作,查看报告http://localhost:8089/
def on_stop(self):
pass
class UserBehavior(HttpUser):
host = '192.168.120.209'
# 每次请求停顿时间
wait_time = between(3, 10)
tasks = [TaskTest]
if __name__ == "__main__":
os.system("locust -f test004.py --host=https://192.168.120.209 --web-host=127.0.0.1")
执行
十秒起100个虚拟用户
![image-1652968149669](https://i-blog.csdnimg.cn/blog_migrate/60957f8dd8b1079f8d395f08906602e7.png)
报告
![image-1652968192885](https://i-blog.csdnimg.cn/blog_migrate/dcad377cff65c1e0d6188b8996559b8c.png)
charts
![image-1652968215586](https://i-blog.csdnimg.cn/blog_migrate/2986897769f9dd42ffe9058f86e4b7f1.png)
![image-1652968224457](https://i-blog.csdnimg.cn/blog_migrate/045c875afc9242a4b69f2fc29880bca2.png)
RPS
![image-1652968244325](https://i-blog.csdnimg.cn/blog_migrate/13a83c7fc68485cdf832dc531635e8b8.png)
分析结果:
平均相应时间:
吞吐量:1000以内
最小相应时间:
最大响应时间:
网络是否有波动:
带宽是否影响:
Linux版本
代码locust_test.py
![image-1652968326638](https://i-blog.csdnimg.cn/blog_migrate/effbbd7abc5d349e918941a7c13372c2.png)
执行命令
./locust -f locust_test.py -u 3000 -r 60 --headless -t 10m --print-stats
报告:动态刷新
![image-1652968359221](https://i-blog.csdnimg.cn/blog_migrate/1c116d178bcf1c600b11cc8419f929f5.png)
可视化监控
Prometheus(普罗米修斯) + grafana
压测前的指标:10000并发
![image-1652968389055](https://i-blog.csdnimg.cn/blog_migrate/1ed8c050d31f580aca7272ca14a07cc6.png)
压测后的指标:
![image-1652968412614](https://i-blog.csdnimg.cn/blog_migrate/6b330b05b55651b3cc4fb5a9205793dc.png)
![image-1652968421096](https://i-blog.csdnimg.cn/blog_migrate/b5cbc20cc107d626e7c02385ce4c6f12.png)
![image-1652968429709](https://i-blog.csdnimg.cn/blog_migrate/a7a12693bc58514eaea4b479aa76c570.png)
压测结束后:
![image-1652968464786](https://i-blog.csdnimg.cn/blog_migrate/168579a5758f8ce93ffbea23e510d851.png)
locust执行结果
![image-1652968570749](https://i-blog.csdnimg.cn/blog_migrate/6334948aa8cf001c49e479bcf075aed2.png)
压测:500并发
![image-1652968484377](https://i-blog.csdnimg.cn/blog_migrate/8f7469b992dedacbbe0b3bb6209d4904.png)
Grafana监控:
![image-1652968501903](https://i-blog.csdnimg.cn/blog_migrate/9ea9f2a61d4bfecd61a0a3bf225332f5.png)
五、locust参数介绍
![image-1652968593177](https://i-blog.csdnimg.cn/blog_migrate/5766243cab66fe9c45b651e4d052de1a.png)
参数名称 参数值 参数说明
-h, --help 不带参数 查看帮助信息
-H HOST, –host=HOST HOST 指定被测试的主机,采用以格式:http://10.21.32.33
–web-host=WEB_HOST WEB_HOST 指定运行 Locust Web 页面的主机,默认为空 “。
-P PORT, –port=PORT, –web-port=PORT PORT 指定 –web-host 的端口,默认是8089
-f LOCUSTFILE, –locustfile=LOCUSTFILE LOCUSTFILE 指定运行 Locust 性能测试文件,默认为: locustfile.py
–csv=CSVFILEBASE, –csv-base-name=CSVFILEBASE CSVFILEBASE 以CSV格式存储当前请求测试数据。
–master 不带参数 Locust 分布式模式使用,当前节点为 master 节点。
–slave 不带参数 Locust 分布式模式使用,当前节点为 slave 节点。
–master-host=MASTER_HOST MASTER_HOST 分布式模式运行,设置 master 节点的主机或 IP 地址,只在与 –slave 节点一起运行时使用,默认为:127.0.0.1.
–master-port=MASTER_PORT MASTER_PORT 分布式模式运行, 设置 master 节点的端口号,只在与 –slave 节点一起运行时使用,默认为:5557。注意,slave 节点也将连接到这个端口+1 上的 master 节点。
–master-bind-host=MASTER_BIND_HOST MASTER_BIND_HOST 做分布式压测时,指定分机IP。只用于master。如果没有指定,默认是所有可用的IP(即所有标记主机IP的slave)
–master-bind-port=MASTER_BIND_PORT MASTER_BIND_PORT 做分布式压测时,指定分机port。默认是5557与5558。
–no-web no-web -c 和 -r 配合 模式运行测试,需要 -c 和 -r 配合使用.
-c NUM_CLIENTS, –clients=NUM_CLIENTS NUM_CLIENTS 指定并发用户数,作用于 –no-web 模式。
-r HATCH_RATE, –hatch-rate=HATCH_RATE HATCH_RATE 指定每秒启动的用户数,作用于 –no-web 模式。
-t RUN_TIME, –run-time=RUN_TIME RUN_TIME 设置运行时间, 例如: (300s, 20m, 3h, 1h30m). 作用于 –no-web 模式。
-L LOGLEVEL, –loglevel=LOGLEVEL LOGLEVEL 选择 log 级别(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默认是 INFO.
–logfile=LOGFILE LOGFILE 日志文件路径。如果没有设置,日志将去 stdout/stderr
–print-stats 不带参数 在控制台中打印数据
–only-summary 不带参数 只打印摘要统计
–no-reset-stats 不带参数 Do not reset statistics once hatching has been completed。
-l, –list 不带参数 显示测试类, 配置 -f 参数使用
–show-task-ratio 不带参数 打印 locust 测试类的任务执行比例,配合 -f 参数使用.
–show-task-ratio-json 不带参数 以 json 格式打印 locust 测试类的任务执行比例,配合 -f 参数使用.
-V, –version 不带参数 查看当前 Locust 工具的版本.
六、测试报告参数介绍
报告数据:
![image-1652968713997](https://i-blog.csdnimg.cn/blog_migrate/ec2d75f0a9b677a6aebf1013bb7f6732.png)
type:请求方式
name:请求路径的api
requests:请求数
fails:请求失败数
Median:中位数,响应时间,单位毫秒
Average:平均数,响应时间,单位毫秒
Min:最小响应时间,单位毫秒
Max:最大响应时间,单位毫秒
Content Size:单个请求大小,单位为字节
reqs/sec:每秒请求数,相当于jmeter的tps
charts:
实时统计的rps
实时统计平均响应时间
实时统计虚拟用户数
七、linux服务器部署可视化监控
Docker部署
Prometheus(普罗米修斯) + grafana
非常炫酷的可视化监控以及丰富的监控插件,以及监控的对象,根据不通的监控需求,选择不同的模板ID,监控的内容非常详细