EMQ單機壓力測試
測試環境:
VM虛擬機 Ubuntu18.04_64
2G內存2核
工具:
emqtt_bench:https://github.com/emqx/emqtt-bench
準備
-
Ubuntu安裝EMQ(省略,可參考官網)
-
編譯Benchmark Tool
因此工具是基於Erlang編寫,故編譯源碼需先安裝Erlang環境
官方要求:Erlang/OTP R21.2+經測試使用過高版本Erlang,編譯時會報錯,特別建議大家安裝R21.2版本。
Erlang安裝參考此處。
Erlang安裝好後,編譯源碼:
編譯成功後,在當前目錄會生成emqtt_bench
測試
在emqtt_bechmark編譯目錄運行命令
-
連接測試:以50ms間隔創建一個客戶端連接服務器,客戶端總數50000
./emqtt_bench conn -c 50000 -i 50 -h 120.0.0.60 -p 1883
-
訂閱測試:以50ms間隔創建一個客戶端訂閱主題bench/%i,客戶端總數50000
./emqtt_bench sub -c 50000 -i 50 -t bench/%i -h 120.0.0.60 -p 1883
-
發佈測試:以50ms間隔創建一個客戶端,客戶端以100ms間隔向主題bench/%i發送數據,客戶端總數50000
./emqtt_bench pub -c 50000 -i 50 -I 100 -t bench/%i -h 120.0.0.60 -p 1883
經測試,虛擬機可以穩定連接的客戶端約2w
注意測試前需要進行參數調優:
```## 服務器端 ##
cat << EOF >> /etc/sysctl.conf
fs.file-max=2097152
fs.nr_open=2097152
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=16384
net.core.netdev_max_backlog=16384
net.ipv4.ip_local_port_range=1000 65535
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216
net.ipv4.tcp_rmem=1024 4096 16777216
net.ipv4.tcp_wmem=1024 4096 16777216
net.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.ipv4.tcp_max_tw_buckets=1048576
net.ipv4.tcp_fin_timeout = 15
EOF
cat << EOF >>/etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
EOF
echo DefaultLimitNOFILE=1048576 >>/etc/systemd/system.conf
cd /etc/emqttd/
cp emq.conf emq.confback
sed -i 's%^node\.process_limit = .*%node.process_limit = 2097152%g' /etc/emqttd/emq.conf
sed -i 's%^node\.max_ports = .*%node.max_ports = 1048576%g' /etc/emqttd/emq.conf
sed -i 's%^listener\.tcp.external\.acceptors = .*%listener.tcp.external.acceptors = 64%g' /etc/emqttd/emq.conf
sed -i 's%^listener\.tcp\.external\.max_clients = .*%listener.tcp.external.max_clients = 1000000%g' /etc/emqttd/emq.conf
## 客戶端 ##
#臨時生效
sysctl -w net.ipv4.ip_local_port_range="500 65535"
echo 1000000 > /proc/sys/fs/nr_open
ulimit -n 100000
#持久化
cat << EOF >>/etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
EOF
cat << EOF >> /etc/sysctl.conf
fs.nr_open=1000000
net.ipv4.ip_local_port_range=500 65535
EOF