最近在利用locust编写压测框架,主要用于模拟公司终端的TcpClient向服务端发送注册报文建立长连接,然后每30s发送一次心跳报文用于维持长连接存在,压测框架搭好之后直接在公司电脑上面进行本地化master-slave压测。开发leader的要求是能够模拟10w个长连接,但是我只能实现1w个长连接的建立和维持。所以这个时候就需要使用到容器技术来解决这个问题,通过dockerfile+docker-compose.yml来创建1个master+6个slave容器进行master-slave多机压测,且实现外网访问master查看性能统计信息。
1、压测框架准备
针对Master以及Slave环境,分别创建了基于locust的Master压测框架以及Slave压测框架
2、镜像打包准备
我基于基础镜像建立了压测框架运行的环境,包含初始化环境、Master环境以及Slave环境,分别commit为如下镜像
1、Master压测环境dockerfile
# 终端TcpClient客户端-Master
FROM luozelin/locust_device_master:v1
LABEL maintainer="luozelin"
# 端口
EXPOSE 8089
# master启动
CMD locust -f /MyProjects/DeviceTcpHttpMaster/RunLab_DeviceTcp_Master.py --master
首先基于镜像,然后暴露端口,最后在容器创建之后执行locust命令开启locust_master
2、Slave压测环境dockerfile
# 终端TcpClient客户端-Slave1
FROM luozelin/locust_device_slave:v1
LABEL maintainer="luozelin"
# slave启动
CMD locust -f /MyProjects/DeviceTcpHttpSlave/RunLab_DeviceTcp_Slave1.py --slave --master-host=172.18.0.2
首先基于镜像,然后在容器创建之后执行locust命令开启locust_slave,并且绑定到master的ip地址(master的ip地址是自定义网段并且给予了固定的ip,这样每次生成的master容器ip地址固定,这样就能在locust命令中将slave与master进行绑定,怎么实现下面将介绍)
查看docker-compost.yml文件
version: "2"
services:
# 终端TcpClient_Master节点
tcp_client_master:
image: luozelin/locust_device_master:v1
build:
context: .
dockerfile: dockerfile_master
container_name: locust_master
ports:
- "8089:8089"
networks:
extnetwork:
ipv4_address: 172.18.0.2
# 终端TcpClient_Slave1节点
tcp_client_slave1:
image: luozelin/locust_device_slave:v1
build:
context: .
dockerfile: dockerfile_slave1
links:
- tcp_client_master
networks:
extnetwork:
ipv4_address: 172.18.0.3
networks:
# 网络自定义
extnetwork:
ipam:
config:
- subnet: 172.18.0.0/16
gateway: 172.18.0.1
上面的docker-compose配置分为两部分,分别为services以及networks,下面分别进行介绍
1、networks网络模块
networks:
# 网络自定义
extnetwork:
ipam:
config:
- subnet: 172.18.0.0/16
gateway: 172.18.0.1
networks网络模块可以自定义网段,其中subnet为分支网络,gateway为网关,设置了这个自定义网段之后就可以指定services的ip地址,也是实现多容器locust多机master-slave压测的关键
2、services服务模块,配置了master以及slave服务
services:
# 终端TcpClient_Master节点
tcp_client_master:
image: luozelin/locust_device_master:v1
build:
context: .
dockerfile: dockerfile_master
container_name: locust_master
ports:
- "8089:8089"
networks:
extnetwork:
ipv4_address: 172.18.0.2
# 终端TcpClient_Slave1节点
tcp_client_slave1:
image: luozelin/locust_device_slave:v1
build:
context: .
dockerfile: dockerfile_slave1
links:
- tcp_client_master
networks:
extnetwork:
ipv4_address: 172.18.0.3
注意:如果自定义的分支网络已经在使用,则会报错,此时可以用以下方法解决
第一、可以通过docker network ls查看当前所有的网络
第二、找到需要删除的分支网络,使用命令docker network rm
跳转到docker-compose.yaml所在的文件夹下,使用命令docker-compose up --build自动生成和配置容器
可以看到master和slave容器分别生成,并且slave已经连接到了master节点上,下面我们在本地浏览器使用http://localhost:8089打开master服务
可以看到在本地浏览器可以打开master生成的locust的web端压测服务,并且可以看到图中slave为1,即表示slave容器已经连接到了master容器上,这样就实现了多容器locust-master-slave压测环境了