压力测试工具 -- locust

 

Locust 是一个易于使用,分布式,用户负载测试工具。它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发用户。在测试期间,一大群虚拟用户访问你的网站。每个测试用户的行为由您定义,集群过程由 web UI 实时监控。这将帮助您在让真正的用户进入之前进行测试并识别代码中的瓶颈。

 

Locust 完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过 gevent 使用轻量级协程。这允许您用 Python 编写非常有表现力的场景,而不用回调使代码复杂化。

 

locust 安装

 

1、支持的python版本:2.7、3.4、3.5、3.6;

 

2、Windows系统安装locust

 

直接通过 pip install locustio 命令安装;

 

 

3.敲入locust -h检验locust是否安装成功,如下

 

 locust运行使用-- no web形式

 

no-web

 

如果采用no_web形式,则需使用--no-web参数,并会用到如下几个参数。

 

  • -c, --clients:指定并发用户数;
  • -n, --num-request:指定总执行测试;
  • -r, --hatch-rate:指定并发加压速率,默认值位1。
  • -t:脚本运行多少时间,单位s

命令:

 

locust -f locust_test.py --no web -c1 -n1 
 

locust运行使用--web形式

 

首先写好locust脚本
from locust import HttpLocust, TaskSet, task

# 定义用户行为,继承TaskSet类,用于描述用户行为

class test_locust(TaskSet):

    @task(1)
    def test_index(self):
        self.client.get("/")
    @task(2)
    def test_duty(self):
        self.client.get("/duty/")
# 这个类类似设置性能测试,继承HttpLocust
class websitUser(HttpLocust):
    # 指向一个上面定义的用户行为类
    task_set = test_locust
    # 执行事物之间用户等待时间的下界,单位毫秒,相当于lr中的think time
    min_wait = 3000
    max_wait = 6000
if __name__ == "__main__":
    import os
    os.system("http://www.baidu.com")

 

启动测试:
命令:locust -f locust_test.py --host=http://www.baidu.com
或locust -f locust_test.py --port=8089
Locust是通过在Terminal中执行命令进行启动的,通用的参数有如下两个:
  • -H, --host:被测系统的host,若在Terminal中不进行指定,就需要在Locust子类中通过host参数进行指定;
  • -f, --locustfile:指定执行的Locust脚本文件;
  • -p,--prot:locust运行端口

 

访问页面:

  

运行界面:

 

1.Type:请求类型;
2.Name:请求路径;
3.requests:当前请求的数量;
4.fails:当前请求失败的数量;
5.Median:中间值,单位毫秒,一般服务器响应时间低于该值,而另一半高于该值;
6.Average:所有请求的平均响应时间,毫秒;
7.Min:请求的最小的服务器响应时间,毫秒;
8.Max:请求的最大服务器响应时间,毫秒;
9.Content Size:单个请求的大小,单位字节;
10.reqs/sec:每秒钟请求的个数。
 
导航栏:
New test:点击该按钮可对模拟的总虚拟用户数和每秒启动的虚拟用户数进行编辑;
Statistics:聚合报告
Charts:测试结果变化趋势的曲线展示图,分别为每秒完成的请求数(RPS)、响应时间、不同时间的虚拟用户数;
Failures:失败请求的展示界面;
Exceptions:异常请求的展示界面;
Download Data:测试数据下载模块, 提供三种类型的CSV格式的下载,分别是:Statistics、responsetime、exceptions;
 
 
Charts图表页面:
  • 1.吞吐量/每秒响应事务数(rps)实时统计

 

  • 2.平均响应时间/平均事务数实时统计

 

  • 3.虚拟用户数运行

 
另外,还有其他统计表格:失败请求、异常请求(断言失败结果显示在这里)、下载测试结果。
这个是通过浏览器测试的形式,可以通过测试场景设计的时间长度运行,压力测试时间(至少都是5分钟以上吧)足够后,需要手动点击stop按钮,结束压力测试。

 

 

locust运行使用--分布式进程

Locust 基于 python 脚本定制化压测,使用 python 语言来实现 参数化、关联参数、断言和一些复杂的压测场景非常方便。Locust 使用协程来构建tcp连接,本身单机并发能力强,但内部是由requests库的httpclient 发起网络请求,requests库功能挺全面,性能却很一般,好在 Locust 支持分布式,弥补了一定的性能缺陷。根据自己做的测试,同样几台客户机,jmeter搭建分布式测出的 qps 比 Locust分布式 高1/3。如果要提升 locust 单进程性能,可以将 httpclient 的实现方式从 requests 换成 geventhttpclient。

 

单台多进程:

  • 先启一个 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
 【注】:master--主节点
    slave--从节点
  • slave 节点启动后,在 locust 监控中能看到

 

多台多进程:

 多台机器搭建 Locust 分布式 和 单台搭建多进程差不多。只有一个区别,如果 slave 和 master 不在一台机器上, slave 需要指定 --master-host 参数:

locust -f /home/script/stress_test.py --slave --master-host 10.1.62.223

  

 

 



posted @ 2021-07-29 15:27  渔人张  阅读(684)  评论(0)    收藏  举报