一、简介
Locust是一个易于使用,分布式,用户负载测试工具。它用于负载测试web站点(或其他系统),并计算出一个系统可以处理多少并发用户。在测试期间,一大群虚拟用户访问你的网站。每个测试用户的行为由您定义,集群过程由webUI实时监控。这将帮助您在让真正的用户进入之前进行测试并识别代码中的瓶颈。
Locust完全是基于事件的,因此在一台机器上支持数千个并发用户是可能的。与许多其他基于事件的应用程序不同,它不使用回调。相反它通过gevent使用轻量级协程。这允许您用Python编写非常有表现力的场景,而不用回调使代码复杂化。
二、安装
用pip管理工具安装:
pip3 install locust
检查是否安装成功,执行命令:locust--v
三、压测过程
1.编写脚本
Locust不同于jmeter可以用GUI来创建压测脚本。Locust需要自己编写python脚本,压测负载脚本主要包含两个子类UserTask和WebsiteUser,分别继承TaskSet和Httplocust类,拥有这两个父类的公共属性和方法。
fromlocustimportHttpLocust,TaskSet,task,between importos,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") assertjson.loads(r.text)['Error']==0 @task(1) def sale(self): self.client.get("/sz/Home/FlashSaleRequest") assertjson.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-fstress_test.py')
locust运行时:
on_start():每个并发用户在开始前各执行一次
on_stop():每个并发用户在结束后各执行一次
@task:通过装饰器设置运行权重,比如上面代码中执行任务home_index和sale的总请求为2:1
assert:断言设置
wait_time:每个任务之间设置间隔时间,随机从3~5区间内取,单位是s
locust-f:指定.py压测脚本路径
2.Locust监控
顺带提一下locustwebUI监控是基于flask框架,不指定port的话,默认地址:http://localhost:8089
开始测试,Locust提供一个简易的监控界面,可以看到RPS、响应时间和部分曲线图
3.运行模式
1.webUI模式
locust-fstress_test.py--web-host10.1.44.31--web-port8090
--web-host:指定webUIIP,默认localhost
--web-port:指定webUI端口,默认8089
2.noweb模式
locust-fstress_test.py--no-web-c100-r20-t120
--no-web:指定无webUI模式
-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-host10.1.62.223--master
再启8个slave
locust-f/home/script/stress_test.py--slave
slave节点启动后,在locust监控中能看到
多台多进程:
多台机器搭建Locust分布式和单台搭建多进程差不多。只有一个区别,如果slave和master不在一台机器上,slave需要指定--master-host参数:
locust-f/home/script/stress_test.py--slave--master-host10.1.62.223
更多功能使用请查看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