转载*请注明原始出处: /a464057216/article/details/48448231
后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
当一台机器已经达到Locust工具能够模拟的用户数量上限时,我们不得不在另外几台机器上部署Locust,然后拷贝一份一模一样的脚本,进行分布式Locust的使用。一般在使用的时候,有一台机器作为主机(master),其余机器作为备机(slave)。我在工作中一般将virtualenv和放在Git上,每次测试前以master机器的代码为基准,先push到远端,再在其他所有slave机器上pull一遍保证一致性。下面分别介绍。
在主机A(IP地址为192.168.1.2)上运行命令:
mars@mars-Ideapad-V460:~/test$ locust --master
[2015-09-14 22:14:48,792] mars-Ideapad-V460/INFO/: Starting web monitor at *:8089
[2015-09-14 22:14:48,867] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
上面的命令会在主机上开启Locust的侦听服务,主机不会模拟任何Locust用户,也不会做任何测试活动,这些都是备机干的事,主机只负责侦听备机发来的统计数据和生成WEB的观察界面。也可以指定master机器监听的端口(如果指定的端口是n,则会同时监听端口n+1,--master-bind-port
的默认值是5557):
mars@mars-Ideapad-V460:~/test$ locust --master --master-bind-port=4445
[2015-09-14 22:19:00,972] mars-Ideapad-V460/INFO/: Starting web monitor at *:8089
[2015-09-14 22:19:00,974] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
也可以通过--master-bind-host
指定Locust主机服务绑定到哪个网卡,如果主机有多个网络,可以做如下指定(--master-bind-host
的默认值是*):
mars@mars-Ideapad-V460:~/test$ locust --master --master-bind-host=192.168.1.2
[2015-09-14 22:22:31,331] mars-Ideapad-V460/INFO/: Starting web monitor at *:8089
[2015-09-14 22:22:31,335] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
在备机B上运行如下命令:
mars@mars-Ideapad-V460:~/test$ locust --slave --master-host=192.168.1.2
[2015-09-14 22:24:12,980] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
此时在主机上会看到如下信息:
[2015-09-14 22:24:12,981] mars-Ideapad-V460/INFO/: Client ‘mars-Ideapad-V460_e3ee672bdd31a05544223eb1cc66edb2’ reported as ready. Currently 1 clients ready to swarm.
--master-host
的默认值是127.0.0.1,如果主机A使用的不是默认监听端口,也可以使用如下命令指定目的主机端口(如果指定的端口是n,则会同时监听端口n+1,--master-port
的默认值是5557):
mars@mars-Ideapad-V460:~/test$ locust --slave --master-host=192.168.1.2 --master-port=4445
[2015-09-14 22:28:17,837] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
Locust其实也可以在一个机器的多个进程中运行,一个进程作为主进程,其余进程作为备进程,比如在终端运行如下命令:
mars@mars-Ideapad-V460:~/test$ locust --master
[2015-09-14 22:41:53,213] mars-Ideapad-V460/INFO/: Starting web monitor at *:8089
[2015-09-14 22:41:53,214] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
然后重新打开一个终端窗口,运行:
mars@mars-Ideapad-V460:~/test$ locust --slave
[2015-09-14 22:42:01,902] mars-Ideapad-V460/INFO/: Starting Locust 0.7.3
如果要终止分布式Locust的运行,直接在master机器上Ctrl + C关闭即可,slave机器会接收到停止信号自动停止运行。
在前一篇博客中提到Locust的两个钩子,分别和master接受数据及slave发送数据有关:
- report_to_master:slave向master发送数据时触发,钩子函数定义需要提供如下参数:
client_id:slave的client id
data:slave向master发送的数据,是一个dict类型的参数。注意stats、errors是Locust使用的key,自定义时不要使用这两个key。
- slave_report:master接收到slave发送来的数据时触发,钩子函数定义需要提供如下参数:
client_id:slave的client id
data:slave向master发送的数据,是一个dict类型的参数。
下面举一个使用这两个钩子函数的例子:
from locust import HttpLocust, TaskSet, events, task
def on_report_to_master(client_id, data):
data['mars'] = 'loo'
print "Slave: Client %s, data " % client_id, data
def on_slave_report(client_id, data):
print "Master Recive: Client %s, data " % client_id, data
events.report_to_master += on_report_to_master
events.slave_report += on_slave_report
class UserTask(TaskSet):
@task(1)
def job(self):
pass
class User(HttpLocust):
task_set = UserTask
min_wait = 3000
max_wait = 5000
host = ''
运行之后,master机器的输出如下:
(env) Mars:tmp Mars$ locust --master
[2016-06-25 18:27:37,736] localhost/INFO/: Starting web monitor at *:8089
[2016-06-25 18:27:37,737] localhost/INFO/: Starting Locust 0.7.5
[2016-06-25 18:27:37,881] localhost/INFO/: Client 'localhost_3320bbf029a4740346dbf04271927bb1' reported as ready. Currently 1 clients ready to swarm.
[2016-06-25 18:27:37,881] localhost/INFO/stdout: Master Recive: Client localhost_3320bbf029a4740346dbf04271927bb1, data
[2016-06-25 18:27:37,881] localhost/INFO/stdout:
[2016-06-25 18:27:37,881] localhost/INFO/stdout: {'errors': {}, 'stats': [], 'user_count': 0, 'mars': 'loo'}
slave机器的输出如下:
(env) Mars:tmp Mars$ locust --slave
[2016-06-25 18:27:34,092] localhost/INFO/: Starting Locust 0.7.5
[2016-06-25 18:27:34,092] localhost/INFO/stdout: Slave: Client localhost_3320bbf029a4740346dbf04271927bb1, data
[2016-06-25 18:27:34,092] localhost/INFO/stdout:
[2016-06-25 18:27:34,092] localhost/INFO/stdout: {'errors': {}, 'stats': [], 'mars': 'loo'}
最后,Locust工具支持MIT License,基于FLask框架开发,如果想在它的基础上对功能进行修改可以先学习下它的源码再进行修改。
比如如果想要增加新的Web界面,可以参考如下代码:
from locust import web, Locust, TaskSet, task
@("/mars")
def my_added_page():
return "Another page"
class UserTask(TaskSet):
@task
def job(self):
pass
class User(Locust):
task_set = UserTask
min_wait = 1000
max_wait = 2000
打开浏览器访问可以看到如下页面:
如果觉得我的文章对您有帮助,欢迎关注我(****:Mars Loo的博客)或者为这篇文章点赞,谢谢!