目标:测试创建1000万客户端连接到Coolpy7 MQTT服务器端,服务器操作系统 Linux(任意一款发行版服务器版本)。分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器。在硬件一致的情况下请确保网络设备达到相关测试要求,例如万兆网络等等。
服务端系统参数调优(Linux)
修改文件/etc/sysctl.conf,配置网络参数。
net.ipv4.tcp_wmem = 4096 87380 4161536
net.ipv4.tcp_rmem = 4096 87380 4161536
net.ipv4.tcp_mem = 786432 2097152 3145728
fs.file-max = 12000000 #一千两百万
执行/sbin/sysctl -p即时生效。
echo 12000000 > /proc/sys/fs/nr_open #需root权限
/etc/systemd/system.conf 设置服务最大文件句柄数:
DefaultLimitNOFILE=12000000
修改/etc/security/limits.conf文件
* hard nofile 12000000
* soft nofile 12000000
* soft nproc 12000000
* hard nproc 12000000
需重启系统生效,服务器操作系统参数调优完成。关于启动CoolPy7服务器端程序请参阅本章中的《程序安装》小节
客户端的参数调优(Linux)
根据TCP/IP协议,由于端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,所以能分配的端口只是1024到65534,也就是64511个。一台机器一个IP只能创建六万多个长连接。 要想达到更多的客户端连接,可以用更多的机器或者网卡,也可以使用虚拟IP来实现,比如下面的命令增加了19个IP地址,其中一个给服务器用,其它18个给client,这样可以产生18 * 60000 = 1080000个连接。本测试用例需要增加到一千万或以上的足够IP。
以上指令查看到网卡名称为 eth0
以上指令操作增加虚拟IP,添加完成后通过 ifconfig 指令查看确认所有虚拟IP最已列出。
修改/etc/sysctl.conf文件:
fs.file-max = 12000000
fs.nr_open = 12000000
net.ipv4.ip_local_port_range = 1024 65535
执行/sbin/sysctl -p即时生效。
echo 12000000 > /proc/sys/fs/nr_open #需root权限
/etc/security/limits.conf配置
* soft nofile 12000000
* hard nofile 12000000
* soft nproc 12000000
* hard nproc 12000000
# 下载测试工具
git clone https://github.com/Coolpy7/coolpy7_benchmark.git
# 进入bin文件夹
cd bin
# 启动Coolpy7静连接测试工具
# 参数url: Coolpy7服务端所在服务器ip地址,默认端口号:1883
# 参数workers: 需要创建的客户端连接数量
# 参数cid: mqtt连接客户端(ClientId)前缀,工具会自动以cid+WorkersId作为连接clientid值
# 参数topic: 连接成功后订阅的topic主题(支持以%i取得workersid:例: mytopic%i)不进行订阅测试填写null字符串
# 参数keepalive: 连接ping时间间隔
# 参数clear: mqtt客户端连接的clearsession属性,当设置为true时重连时不能再次订阅qos0以上的主题
# 以下例示建立连接到192.168.200.238所在的Coolpy7服务器端,并创建400万个MQTT客户端连接
./go_build_cp7_bench_sub_go_linux -workers=4000000 -cid=tqy -topic=null -qos=0 -url=tcp://192.168.200.238:1883 -keepalive=60000s -clear=true
测试时需时刻关注服务器端网络资源使用情况,测试数据显示在高连接数下ping/pong状态下已占用极大的网络带宽,需根据当前设备的硬件资源合理设置最大连接数量以保证系统的稳定长期运行
服务器端启动并host于1883 TCP端口
通过HTOP工具监测Coolpy7(连接时)硬件资源占用情况
通过NLOAD工具监测Coolpy7(连接时)网络资源占用情况
使用Coolpy_benchmark工具测试连接400万连接
- 测试工具开源地址:https://github.com/Coolpy7/coolpy7_benchmark
- 工具会以1000为单位打印连接信息
- 工具启动后会一直创建参数指定的客户端连接数
按应用场景测试
MQTT 是一个设计得非常出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着广泛的应用。1个字节报头、2个字节心跳、消息 QoS 支持等设计,非常适合在低带宽、不可靠网络、嵌入式设备上应用。
不同的应用有不同的系统要求,用户使用Coolpy7消息服务器前,可以按自己的应用场景进行测试,而不是简单的连接压力测试:
- Android 消息推送: 推送消息广播测试。
- 移动即时消息应用: 消息收发确认测试。
- 智能硬件应用: 消息的往返时延测试。
- 物联网数据采集: 并发连接与吞吐测试。