目標:測試建立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
修改文件/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
即時生效。網絡
/etc/systemd/system.conf 設置服務最大文件句柄數:session
修改/etc/security/limits.conf
文件併發
* hard nofile 12000000 * soft nofile 12000000 * soft nproc 12000000 * hard nproc 12000000
需重啓系統生效,服務器操做系統參數調優完成。關於啓動CP7服務器端程序請參閱本章中的《程序安裝》小節app
根據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
即時生效。
/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
客戶端鏈接數 |
系統使用內存 |
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狀態下已佔用極大的網絡帶寬,需根據當前設備的硬件資源合理設置最大鏈接數量以保證系統的穩定長期運行
從服務器端的硬件資源使用狀況得出結論單機千萬級鏈接便可實現,如閣下有相關硬件設備實測千萬級用例,請把測試結果告知Coolpy7官方。感謝!
工具會以1000爲單位打印鏈接信息
工具啓動後會一直建立參數指定的客戶端鏈接數
MQTT 是一個設計得很是出色的傳輸層協議,在移動消息、物聯網、車聯網、智能硬件甚至能源勘探等領域有着普遍的應用。1個字節報頭、2個字節心跳、消息 QoS 支持等設計,很是適合在低帶寬、不可靠網絡、嵌入式設備上應用。
不一樣的應用有不一樣的系統要求,用戶使用Coolpy7消息服務器前,能夠按本身的應用場景進行測試,而不是簡單的鏈接壓力測試:
Android 消息推送: 推送消息廣播測試。
移動即時消息應用: 消息收發確認測試。
智能硬件應用: 消息的往返時延測試。
物聯網數據採集: 併發鏈接與吞吐測試。