單機千萬級MQTT連接服務器測試報告


目標:測試創建1000萬客戶端連接到服務器端,服務器操作系統 Linux(任意一款發行版服務器版本)。分別在兩台硬件一樣的服務器,其中一台用於服務器端運行,另一台用於創建千萬客戶端連接客戶端機器。在硬件一致的情況下請確保網絡設備達到相關測試要求,例如萬兆網絡等等。

服務器硬件配置

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值。

服務端系統參數調優(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

需重啟系統生效,服務器操作系統參數調優完成。關於啟動CP7服務器端程序請參閱本章中的《程序安裝》小節

客戶端的參數調優(Linux)

根據TCP/IP協議,由於端口是16位整數,也就只能是0到 65535,而0到1023是預留端口,所以能分配的端口只是1024到65534,也就是64511個。一台機器一個IP只能創建六萬多個長連接。 要想達到更多的客戶端連接,可以用更多的機器或者網卡,也可以使用虛擬IP來實現,比如下面的命令增加了19個IP地址,其中一個給服務器用,其它18個給client,這樣可以產生18 * 60000 = 1080000個連接。本測試用例需要增加到一千萬或以上的足夠IP。

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. 物聯網數據采集: 並發連接與吞吐測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM