天天看點

EMQ百萬級MQTT消息服務(優化和壓測)

如果使用EMQ來承載百萬級别的使用者連接配接可以嗎?官方的回複是8核心32G的配置能夠承載160W台裝置的連結,那就究竟性能如何呢?隻有你自己試了才知道,本節就帶着大家一起有調優系統配置和對EMQ進行壓力測試來一探EMQ的廬山真面目

附上:

喵了個咪的部落格:

w-blog.cn EMQ官方位址: http://emqtt.com/ EMQ中文文檔: http://emqtt.com/docs/v2/guide.html

1.Liunx和Erlang虛拟機調優

Linux 系統參數優化

修改系統所有程序可打開的檔案數量

sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152

> vi /etc/sysctl.conf
fs.file-max = 2097152
fs.nr_open = 2097152           

設定服務最大檔案句柄數

vim /etc/systemd/system.conf 
DefaultLimitNOFILE=1048576           

持久化設定允許使用者/程序打開檔案句柄數:

ulimit -n 1048576

> vim /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576           

可用'*'号表示修改所有使用者的限制;soft或hard指定要修改軟限制還是硬限制;10240則指定了想要修改的新的限制值,即最大打開檔案數(請注意軟限制值要小于或等于硬限制)。

TCP 協定棧網絡參數

> vi /etc/sysctl.conf

### backlog - Socket 監聽隊列長度:
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'

## TCP Socket 讀寫 Buffer 設定:
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

#sysctl -w net.ipv4.tcp_mem='16777216 16777216 16777216'
net.ipv4.tcp_rmem='1024 4096 16777216'
net.ipv4.tcp_wmem='1024 4096 16777216'

## TCP 連接配接追蹤設定:
net.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

## FIN-WAIT-2 Socket 逾時設定:
net.ipv4.tcp_fin_timeout = 15
## TIME-WAIT Socket 最大數量、回收與重用設定:
net.ipv4.tcp_max_tw_buckets=1048576

# 注意: 不建議開啟該設定,NAT模式下可能引起連接配接RST
# net.ipv4.tcp_tw_recycle = 1
# net.ipv4.tcp_tw_reuse = 1
           

Erlang 虛拟機參數

> vim /usr/local/emqttd/etc/emq.conf
## Erlang Process Limit
node.process_limit = 2097152
## Sets the maximum number of simultaneously existing ports for this system
node.max_ports = 1048576

## EMQ 最大允許連接配接數
## Size of acceptor pool
listener.tcp.external.acceptors = 64
## Maximum number of concurrent clients(以1G記憶體比5W進行配置)
listener.tcp.external.max_clients = 1000000           

重新開機emq之後可以在Dashboard看到如下顯示:

2.壓測程式EMQ

進行壓力測試需要erlang R17版本以上的環境(預設yum裝下來是R16版本,如果yum能裝到新版本請無視)

## 依賴
yum -y install ncurses-devel openssl-devel unixODBC-devel gcc-c++  
mkdir -p /app/install $$ cd /app/install/
wget http://erlang.org/download/otp_src_19.0.tar.gz
tar -xvzf otp_src_19.0.tar.gz
cd otp_src_19.0
./configure --prefix=/usr/local/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac
make && make install           

配置erl環境變量

vim /etc/profile

# erlang
export ERLPATH=/usr/local/erlang
export PATH=$ERLPATH/bin:$PATH

source /etc/profile           

安裝壓測軟體

yum -y install git
cd /app/install
git clone https://github.com/emqtt/emqtt_benchmark.git
cd emqtt_benchmark
## 調整系統參數并且開始壓測
sysctl -w net.ipv4.ip_local_port_range="500 65535"
echo 1000000 > /proc/sys/fs/nr_open
ulimit -n 1000000
./emqtt_bench_sub -h 192.168.2.111 -c 32219 -i 1 -t bench /%i -q 2           

附上筆者壓測圖:

筆者使用了1核1G的伺服器14台對2核心8G的EMQ伺服器進行壓力得到了44W的穩定連結峰值,可以得知最佳比例是1G記憶體對應6W裝置連接配接,和官方給出的32G記憶體160W台裝置的連接配接數非常接近

3 總結

通過系統調優之後的壓力測試基本得到了和官方一緻的資料,可以見得EMQ能承載的連接配接數确實很驚人,對的起百萬級别消息服務的稱呼,得到這個結論之後我們下一步就是開始叢集的權限限制的探索,我們不見不散哦……

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!

繼續閱讀