python性能测试工具locust的使用
作者:三只松鼠 发布时间:2021-06-28 09:12:50
一、简介
Locust 是一个易于使用,分布式,用户负载测试工具。它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发用户。在测试期间,一大群虚拟用户访问你的网站。每个测试用户的行为由您定义,集群过程由 web UI 实时监控。这将帮助您在让真正的用户进入之前进行测试并识别代码中的瓶颈。
Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。
二、安装
用 pip 管理工具安装:
pip3 install locust
检查是否安装成功,执行命令:locust --v
三、压测过程
1.编写脚本
Locust 不同于 jmeter 可以用 GUI 来创建压测脚本。Locust 需要自己编写 python 脚本,压测负载脚本主要包含两个子类UserTask和WebsiteUser,分别继承TaskSet和Httplocust类,拥有这两个父类的公共属性和方法。
from locust import HttpLocust, TaskSet, task, between
import os,json
# 定义用户行为
class UserTask(TaskSet):
def on_start(self):
'''初始化数据,每个虚拟用户只执行一次'''
self.client.post("/login",{"username":"test","password":"123456"})
@task(2)
def home_index(self):
r = self.client.get("/sz/Home/DefaultHomeV2Request")
assert json.loads(r.text)['Error'] == 0
@task(1)
def sale(self):
self.client.get("/sz/Home/FlashSaleRequest")
assert json.loads(r.text)['Error'] == 0
def on_stop(self):
'''销毁数据,每个虚拟用户只执行一次'''
self.client.post("/SignOut",{"CustomerGuid":"c7d7e646-9ce2-499b-a22e-a3c98d4545fe"})
class WebsiteUser(HttpLocust):
host = 'http://10.1.62.126'
task_set = UserTask
wait_time = between(3, 5)
if __name__ == "__main__":
os.system('locust -f stress_test.py ')
locust 运行时:
on_start() :每个并发用户在开始前各执行一次
on_stop():每个并发用户在结束后各执行一次
@task: 通过装饰器设置运行权重,比如上面代码中 执行任务 home_index 和 sale 的总请求为 2:1
assert:断言设置
wait_time :每个任务之间设置间隔时间,随机从3~5区间内取,单位是 s
locust -f:指定 .py 压测脚本路径
2. Locust 监控
顺带提一下 locust web UI监控是基于 flask 框架,不指定 port 的话,默认地址:http://localhost:8089
开始测试,Locust 提供一个简易的监控界面,可以看到 RPS、响应时间 和 部分曲线图
3.运行模式
1.web UI 模式
locust -f stress_test.py --web-host 10.1.44.31 --web-port 8090
--web-host:指定 web UI IP,默认 localhost
--web-port:指定 web UI 端口,默认 8089
2. no web 模式
locust -f stress_test.py --no-web -c 100 -r 20 -t 120
--no-web:指定无 web UI模式
-c:起多少 locust 用户(等同于起多少 tcp 连接)
-r:多少时间内,把上述 -c 设置的虚拟用户全部启动
-t:脚本运行多少时间,单位s
在 --no-web 模式下的报告如下:
4.分布式进程
Locust 是由 python 编写的,由于GIL的限制,单进程不能利用CPU多核的优势(实际测试结果也是一样,8核心的虚拟机,只有一核达到了95%以上的使用率,其余7核只围观,不出力)。所以单台机器上想要尽可能的压榨 CPU,只能开启多进程,一般有多少个核心启多少进程。
单台多进程:
先启一个 master
locust -f /home/script/stress_test.py --web-host 10.1.62.223 --master
再启 8 个 slave
locust -f /home/script/stress_test.py --slave
slave 节点启动后,在 locust 监控中能看到
多台多进程:
多台机器搭建 Locust 分布式 和 单台搭建多进程差不多。只有一个区别,如果 slave 和 master 不在一台机器上, slave 需要指定 --master-host 参数:
更多功能使用请查看Locust官方文档,形成良好的习惯 :官方文档
四、总结
Locust 基于 python 脚本定制化压测,使用 python 语言来实现 参数化、关联参数、断言和一些复杂的压测场景非常方便。Locust 使用协程来构建tcp连接,本身单机并发能力强,但内部是由requests库的httpclient 发起网络请求,requests库功能挺全面,性能却很一般,好在 Locust 支持分布式,弥补了一定的性能缺陷。根据自己做的测试,同样几台客户机,jmeter搭建分布式测出的 qps 比 Locust分布式 高1/3。如果要提升 locust 单进程性能,可以将 httpclient 的实现方式从 requests 换成 geventhttpclient ,这个下一篇再讲述。
来源:https://www.cnblogs.com/shenh/p/12424990.html


猜你喜欢
- 实例1、取得MYSQL的版本在windows环境下安装mysql模块用于python开发MySQL-python Windows下EXE安装
- 1.参考Beautiful Soup and Unicode Problems详细解释unicodedata.normalize('
- 主要能兼容: PHP 5 一、chdir -- 改变目录 语法:bool chdir&nb
- python代码 for i, para in enumerate(self._net.module.featur
- 服务器之间的http数据传输直接使用python内置的http服务:python -m SimpleHTTPServer 8000此时,输入
- 使用pandas读xlsx文件读取前n行数据读取指定数据(指定行指定列)获取文件行号和列标题将数据转换为字典形式import pandas
- TTS简介TTS(Text To Speech)是一种语音合成技术,可以让机器将输入文本以语音的方式播放出来,实现机器说话的效果。TTS分成
- 在网页中,我们经常需要引用大量的javascript和css文件,在加上许多javascript库都包含debug版和经过压缩的releas
- python——pip install xxx报错SyntaxError: invalid syntax在安装好python后,进入pyth
- 我就废话不多说了,还是直接看代码吧!import osimport timeimport mmapfilename = 'test.
- 对衍射最经典的解释是Huygens-Fresnel原理,Huygens认为波阵面上每一点都会成为新的波源,这些子波源的相互干涉就形成了衍射。
- 例如输入:['adam', 'LISA', 'barT'],输出:['Adam
- 今天写了一个简单的验证,本来前面用的组件,但是感觉写的组件在此项目不是很好用,由于用到的地方比较少,所以直接写在了页面中。<div&g
- 临近下班的时候,突然想到统计热门文章的问题。以前我所知道的热门文章统计,基本有这么几种:按点击数排序 该方法最大的问题在于热门的文章会越来越
- 如下所示:#!/usr/bin/env pythonimport osimport sysclass CConsole: M_MAP_COL
- 本文实例为大家分享了Python 12306抢火车票的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-fro
- 我用 ip=Request.ServerVariables
- 这篇文章主要介绍了js神秘的电报密码 哈弗曼编码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 代码如下:DECLARE @c INT DECLARE @c2 INT SELECT @c = COUNT(1) FROM dbo.Spli
- 写在前面当然这里说的百分百可能有点夸张,但其实想象一下,游戏里面的某个窗口的字符就是那种样子,不会变化的。而且识别的字符可能也不需要太多。中