在使用Locust进行压测时,我们往往需要使用分布式的方式来进行压测,因为分布式可以很好的降低宿主机创造并发用户的压力,而且也能够更好的满足我们创造大量并发用户的需求。那么实现分布式压测时我们一般都会考虑到多机压测,例如使用Jmeter、LR时,在进行分布式压测时都需要多台机器进行部署才可以实现,我个人猜想是由于Jmeter与LR都是基于线程来创建并发用户的,一个并发用户就是一个线程,所以需要实现分布式的话只能多台机器一同协作完成。
而Locust则不同,Locust是基于协程实现并发用户的,协程是比线程更小的单位,也称为子线程,在一个线程中可以运行多个协程。所以基于协程的Locust,在进行分布式部署时,不仅可以进行多机压测部署,而且还可以在一台宿主机中完成,两者的部署方式相同,不过本篇博客主要介绍在本地宿主机如何结合Python进行分布式部署,下面具体介绍给大家。
1、先写好一个基于locust的locust运行文件
首先我们需要通过python+locust写出程序需要运行的.py文件,这是运行locust的基础,具体如何写请百度
import os
from locust import HttpLocust,TaskSet,task
#定义任务类
class UserTask001(TaskSet):
@task #申明需要执行的任务
def get_index(self):
self.client.get('/') #client是requests的对象
@task
def get_image(self):
self.client.get('/s?ie=utf-8&wd=locust视频')
#执行任务类
class WebSiteUser(HttpLocust):
task_set = UserTask001 #定义需要执行的任务集
min_wait = 1000 #最小等待时间(思考时间)
max_wait = 2000 #最大等待时间(思考时间)
host = 'http://www.baidu.com' #设定请求的域名
2、创建locust运行的master
写好需要运行的locust文件之后,我们需要先利用命令“locust -f xxxx.py --master”创建一个master,这个master不参与创建并发用户的工作,它主要是进行监听以及收集统计数据,从而提供给web端,当然我们完全可以利用python当中的os的system函数直接编写出cmd命令进行运行(下面的uc_locust_run.py改成你自己的py文件名称即可)
if __name__=="__main__":
#开启master模式
os.system('locust -f uc_locust_run.py --master')
此时我们运行py文件,可以看到以下的信息,则说明我们已经启动了locust分布式的主节点master
[2019-06-17 13:37:03,159] DESKTOP-LB6NBMD/INFO/locust.main: Starting web monitor at *:8089
[2019-06-17 13:37:03,189] DESKTOP-LB6NBMD/INFO/locust.main: Starting Locust 0.9.0
3、创建locust运行的slave
在创建好了master之后,我们就可以创建用于制造并发用户的分支节点slave了,方法就是复制master的文件,然后修改一下文件名称,一定要保证slave运行的文件与master文件是一样的,自己的机器有多少个cpu就可以弄多少个slave,一般一个slave会使用一个cpu创建并发用户
然后每个slave文件中需要在主函数中输入cmd命令(下图是uc_locust_run_slave1.py的主函数)
if __name__=="__main__":
#开启master模式
os.system('locust -f uc_locust_run_slave1.py --slave')
4、运行master与slave
创建完master与slave之后,我们就可以先运行master再运行slave,可以查看以下内容来判断分布式是否部署成功
4.1、运行master开启服务
[2019-06-17 13:37:03,159] DESKTOP-LB6NBMD/INFO/locust.main: Starting web monitor at *:8089
[2019-06-17 13:37:03,189] DESKTOP-LB6NBMD/INFO/locust.main: Starting Locust 0.9.0
4.2、运行多个slave
[2019-06-17 13:45:32,422] DESKTOP-LB6NBMD/INFO/locust.main: Starting Locust 0.9.0
4.3、当开启全部slave后,可以查看master的控制台信息,看到下面的信息则表示locust分布式部署成功了
[2019-06-17 13:37:03,159] DESKTOP-LB6NBMD/INFO/locust.main: Starting web monitor at *:8089
[2019-06-17 13:37:03,189] DESKTOP-LB6NBMD/INFO/locust.main: Starting Locust 0.9.0
[2019-06-17 13:45:32,432] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_53885debd99fafd97786c5aaa80c5af0' reported as ready. Currently 1 clients ready to swarm.
[2019-06-17 13:46:25,757] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_a9d07a398543c539fa74065634f34495' reported as ready. Currently 2 clients ready to swarm.
[2019-06-17 13:46:30,248] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_3ef057b3da2a4ed43477e9b0583c4ed5' reported as ready. Currently 3 clients ready to swarm.
[2019-06-17 13:46:34,369] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_a110024a0c10f655b49b16d618f9d813' reported as ready. Currently 4 clients ready to swarm.
[2019-06-17 13:46:38,138] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_f296c95e78b78f98f02f44ebd0cad0b0' reported as ready. Currently 5 clients ready to swarm.
[2019-06-17 13:46:41,920] DESKTOP-LB6NBMD/INFO/locust.runners: Client 'DESKTOP-LB6NBMD_970b211035de32aac0b5708674448a53' reported as ready. Currently 6 clients ready to swarm.
5、打开web端同样也可以查看到分布式的slave
1、在locust当中使用web模式进行压测时是没有办法设定执行时间的,所以web模式下的压测会一直运行,直到点击stop才能运行,如果想在web模式下运行压测一段时间自动停止的话,那么需要在参数配置时加入stop_timeout参数即可,value值是执行的时间(单位是s)
#执行压测总配置
class WebSiteUser(HttpLocust):
task_set = UserCenterTask
min_wait = 1000
max_wait = 2000
host = sethost
stop_timeout = 60