如果使用EMQ来承载百万级别的用户连接可以吗?官方的回复是8核心32G的配置能够承载160W台设备的链接,那就究竟性能如何呢?只有你自己试了才知道,本节就带着大家一起有调优系统配置和对EMQ进行压力测试来一探EMQ的庐山真面目
附上:
喵了个咪的博客:w-blog.cn EMQ官方地址:http://emqtt.com/ EMQ中文文档:http://emqtt.com/docs/v2/guide.html
修改系统所有进程可打开的文件数量
sysctl -w fs.file-max=2097152 sysctl -w fs.nr_open=2097152 > vi /etc/sysctl.conf fs.file-max = 2097152 fs.nr_open = 2097152 123456设置服务最大文件句柄数
vim /etc/systemd/system.conf DefaultLimitNOFILE=1048576 12持久化设置允许用户/进程打开文件句柄数:
ulimit -n 1048576 > vim /etc/security/limits.conf * soft nofile 1048576 * hard nofile 1048576 12345可用’*’号表示修改所有用户的限制;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 123456789101112131415161718192021222324252627282930313233343536Erlang 虚拟机参数
> 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 1234567891011重启emq之后可以在Dashboard看到如下显示:
进行压力测试需要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 12345678配置erl环境变量
vim /etc/profile # erlang export ERLPATH=/usr/local/erlang export PATH=$ERLPATH/bin:$PATH source /etc/profile 1234567安装压测软件
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 123456789附上笔者压测图: 笔者使用了1核1G的服务器14台对2核心8G的EMQ服务器进行压力得到了44W的稳定链接峰值,可以得知最佳比例是1G内存对应6W设备连接,和官方给出的32G内存160W台设备的连接数非常接近
通过系统调优之后的压力测试基本得到了和官方一致的数据,可以见得EMQ能承载的连接数确实很惊人,对的起百万级别消息服务的称呼,得到这个结论之后我们下一步就是开始集群的权限限制的探索,我们不见不散哦……
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!