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能承载的连接数确实很惊人,对的起百万级别消息服务的称呼,得到这个结论之后我们下一步就是开始集群的权限限制的探索,我们不见不散哦……

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏埋名

常见HTTP/FTP/WebSockets状态码大全

这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1...

2913
来自专栏Vamei实验室

树莓派:文本编辑器与文件

GNU nano是Unix系统下一款常用的文本编辑器,以简单易用著称。与之相比,功能更强大的Vi和Emacs编辑器,学习曲线比nano陡峭很多。由于nano对于...

2955
来自专栏数据之美

玩转 Linux 之:由 Nginx log rotation 聊聊 mv 的妙用

1、Nginx 下如何正确的做日志切分 今天发现有个 Nginx 日志 rotation 出来大小是 0,很奇怪,按公司的业务场景来说,这是不可能的。 瞅了...

25410
来自专栏建站达人秀

如何搭建 LAMP 网站服务环境

Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为...

4895
来自专栏即时通讯技术

新手入门:史上最全Web端即时通讯技术原理详解前言 学习交流 更多资料一、传统Web的通信原理二、传统通信方式实现IM应用需要解决的问题三、全双工低延迟的解决办法 五、WebSocket结束语

浏览器本身作为一个瘦客户端,不具备直接通过系统调用来达到和处于异地的另外一个客户端浏览器通信的功能。这和我们桌面应用的工作方式是不同的,通常桌面应用通过sock...

923
来自专栏容器云生态

Openstack平台搭建之第一天 基于RDO方式搭建

openstck基于web方式的rdo部署 If you have any question ,please contact me by weichuangxx...

32610
来自专栏耕耘实录

基于KVM的H3C云计算平台CAS的一些运维经验

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1901
来自专栏北京马哥教育

超清晰的 DNS 原理入门指南

来源:阮一峰的网络日志 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2016/06/dns.html DNS 是互联网核...

3606
来自专栏Youngxj

Emlog插件:右下角添加不同时段问候语1.2

1664
来自专栏影子

Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)

1863

扫码关注云+社区

领取腾讯云代金券