一、单台服务器最高只能跑2W多一点
问题描述一直使用benchmark测试单台EMQ都没有超过3W链接数一个独立的外网IP只能提供最多6W的端口号,但每个TCP需要分配一个指定的端口号。所以理论上讲一台EMQ的服务器最多能跑6W链接数。 关于一直报”shutdown,eaddrnotavail”是因为测试的客户机端口号分配不足,并不是服务端无法分配端口号。单台EMQ测试
1)、使用客户机数据5台 2)、最大链接数在76565 3)、异常情况是应用程序挂掉 erlang.log.4日志===== ALIVE Sun Aug 26 14:56:54 CST 2018 [os_mon] cpu supervisor port (cpu_sup): Erlang has closed [os_mon] memory supervisor port (memsup): Erlang has closed
查看端口号使用命令
#查看端口号使用命令
netstat -npta | grep <端口号>端口号>
netstat -npta |grep <端口号> | wc -l 端口号>
Linux 系统参数优化
修改系统所有进程可打开的文件数量
sysctl -w fs.file-max=2097152sysctl -w fs.nr_open=2097152
vi /etc/sysctl.conf
fs.file-max = 2097152fs.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指定要修改软限制还是硬限制;1048576则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。
TCP 协议栈网络参数
> vi /etc/sysctl.conf### backlog - Socket 监听队列长度:net.core.somaxconn=32768net.ipv4.tcp_max_syn_backlog=16384net.core.netdev_max_backlog=16384## 可用知名端口范围:net.ipv4.ip_local_port_range='1000 65535'## TCP Socket 读写 Buffer 设置:net.core.rmem_default=262144net.core.wmem_default=262144net.core.rmem_max=16777216net.core.wmem_max=16777216net.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=1000000net.netfilter.nf_conntrack_max=1000000net.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 Limitnode.process_limit = 2097152## Sets the maximum number of simultaneously existing ports for this systemnode.max_ports = 1048576## EMQ 最大允许连接数## Size of acceptor poollistener.tcp.external.acceptors = 64## Maximum number of concurrent clients(以1G内存比5W进行配置)listener.tcp.external.max_clients = 1000000
重启emq之后可以在Dashboard看到如下显示:
调整系统参数并且开始压测
cd emqtt_benchmarksysctl -w net.ipv4.ip_local_port_range="500 65535"echo 1000000 > /proc/sys/fs/nr_openulimit -n 1000000./emqtt_bench_sub -h 192.168.2.111 -c 32219 -i 1 -t bench /%i -q 2