单机千万级MQTT链接服务器测试报告

目标:测试建立1000万客户端链接到服务器端,服务器操做系统 Linux(任意一款发行版服务器版本)。分别在两台硬件同样的服务器,其中一台用于服务器端运行,另外一台用于建立千万客户端链接客户端机器。在硬件一致的状况下请确保网络设备达到相关测试要求,例如万兆网络等等。linux

服务器硬件配置git

Dell Inc.
型号	PowerEdge R430
CPU	8 CPUs x Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
内存	64 GB //测试客户端机器内存升级到96 GB

须要测试千万级链接,确保测试工具独占服务器,并硬件内存大于或等于256GB,因为测试硬件资源受限,以400万链接数据测试结果做为参考依据,单机千万链接彻底有可能达到。当商业应用时须要考滤高链接的self-ddos问题,应该尽可能设置更长的客户端keepalive值。github

服务端系统参数调优(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 设置服务最大文件句柄数:session

 
DefaultLimitNOFILE=12000000

修改/etc/security/limits.conf文件并发

* hard nofile 12000000
* soft nofile 12000000
* soft nproc 12000000
* hard nproc 12000000

需重启系统生效,服务器操做系统参数调优完成。关于启动CP7服务器端程序请参阅本章中的《程序安装》小节app

客户端的参数调优(Linux)

根据TCP/IP协议,因为端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,因此能分配的端口只是1024到65534,也就是64511个。一台机器一个IP只能建立六万多个长链接。 要想达到更多的客户端链接,能够用更多的机器或者网卡,也能够使用虚拟IP来实现,好比下面的命令增长了19个IP地址,其中一个给服务器用,其它18个给client,这样能够产生18 * 60000 = 1080000个链接。本测试用例须要增长到一千万或以上的足够IP。tcp

root@:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3e:0b:2e:a0
inet addr:x.x.x.x Bcast:x.x.x.x Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4706185 errors:0 dropped:0 overruns:0 frame:0
TX packets:4705832 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1005604068 (1.0 GB) TX bytes:5556912863 (5.5 GB)
 
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:5875416 errors:0 dropped:0 overruns:0 frame:0
TX packets:5875416 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:3566710813 (3.5 GB) TX bytes:3566710813 (3.5 GB)

以上指令查看到网卡名称为 eth0工具

 
ifconfig eth0:0 192.168.77.10 netmask 255.255.255.0 up
ifconfig eth0:1 192.168.77.11 netmask 255.255.255.0 up
ifconfig eth0:2 192.168.77.12 netmask 255.255.255.0 up
ifconfig eth0:3 192.168.77.13 netmask 255.255.255.0 up
ifconfig eth0:4 192.168.77.14 netmask 255.255.255.0 up
ifconfig eth0:5 192.168.77.15 netmask 255.255.255.0 up
ifconfig eth0:6 192.168.77.16 netmask 255.255.255.0 up
ifconfig eth0:7 192.168.77.17 netmask 255.255.255.0 up
ifconfig eth0:8 192.168.77.18 netmask 255.255.255.0 up
ifconfig eth0:9 192.168.77.19 netmask 255.255.255.0 up

以上指令操做增长虚拟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
使用Coolpy7_benchmark测试客户端测试四百万级链接
 
# 下载测试工具
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
 

客户端链接数

系统使用内存

RES使用内存

VIRT使用内存

CPU使用

网络(进)

网络(出)

100万

4.5G

2633M

2789M

260/1600

2.8M

2M

200万

10.3G

4009M

4152M

277/1600

2.98M

2.15M

300万

14.7G

5517M

5682M

278/1600

3.05M

2.21M

400万

19.3G

7055M

7231M

270/1600

2.91M

2.18M

测试时需时刻关注服务器端网络资源使用状况,测试数据显示在高链接数下ping/pong状态下已占用极大的网络带宽,需根据当前设备的硬件资源合理设置最大链接数量以保证系统的稳定长期运行

相关测试截图
服务器端启动并host于1883 TCP端口
经过HTOP工具监测Coolpy7(链接时)硬件资源占用状况
经过NLOAD工具监测Coolpy7(链接时)网络资源占用状况
使用Coolpy_benchmark工具测试链接400万链接
 

从服务器端的硬件资源使用状况得出结论单机千万级链接便可实现,如阁下有相关硬件设备实测千万级用例,请把测试结果告知Coolpy7官方。感谢!

  1. 工具会以1000为单位打印链接信息

  2. 工具启动后会一直建立参数指定的客户端链接数

按应用场景测试

MQTT 是一个设计得很是出色的传输层协议,在移动消息、物联网、车联网、智能硬件甚至能源勘探等领域有着普遍的应用。1个字节报头、2个字节心跳、消息 QoS 支持等设计,很是适合在低带宽、不可靠网络、嵌入式设备上应用。

不一样的应用有不一样的系统要求,用户使用Coolpy7消息服务器前,能够按本身的应用场景进行测试,而不是简单的链接压力测试:

  1. Android 消息推送: 推送消息广播测试。

  2. 移动即时消息应用: 消息收发确认测试。

  3. 智能硬件应用: 消息的往返时延测试。

  4. 物联网数据采集: 并发链接与吞吐测试。

相关文章
相关标签/搜索