连接数到达547244后就上不去了,是有限制吗?

错误报告

环境

  • EMQX 版本:5.0.17
  • 操作系统版本:debian11

重现此问题的步骤

  1. 启动服务systemctl start emqx
  2. 开始使用emqtt-bench进行连接数测试
    docker run --name emqx_client_11 --net=host --ulimit nofile=1000000:1000000 -d emqx/emqtt-bench conn -h XXX -c 50000 -i 5 --ifaddr XXX
  3. 数量到达547244就上不去了

预期行为

实际行为


功能请求

描述你需要的功能

为什么你需要这个功能


其他

麻烦你总结一下机器配置(emqx 所在机器,以及压力发起机器),emqx 部署架构,所做的配置项优化(操作系统,EMQX),部署方式;以及压力发起机器这边的部署方式和工具,以及压力机器做了哪些优化等。EMQX 开启了哪些服务,是否有认证,规则引擎是否开启等。以及被测机器,和压力发起机器的监控等。服务器或者客户端的日志文件等内容。

在亚马逊云上搭建的服务器
1、emqx主机配置:
系统:debian11
x86_64 8核16G
emqx版本:5.0.17
安装方式(直接安装运行,除了优化设置 Erlang 虚拟机启动参数,没有调整其他,没有开启认证,规则引擎等):
wget https://www.emqx.com/zh/downloads/broker/5.0.19/emqx-5.0.19-debian11-amd64.deb
apt install ./emqx-5.0.19-debian11-amd64.deb
systemctl start emqx

优化项:
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open
ulimit -n 1048576
echo “fs.file-max” = 1048576 >> /etc/sysctl.conf
echo “DefaultLimitNOFILE=1048576” >> /etc/systemd/system.conf
echo “* soft nofile 1048576” >> /etc/security/limits.conf
echo “* hard nofile 1048576” >> /etc/security/limits.conf
sysctl -w net.core.somaxconn=32768
sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.ipv4.ip_local_port_range=‘1024 65535’
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.optmem_max=16777216
sysctl -w net.ipv4.tcp_rmem=‘1024 4096 16777216’
sysctl -w net.ipv4.tcp_wmem=‘1024 4096 16777216’
sysctl -w net.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
sysctl -w net.ipv4.tcp_max_tw_buckets=1048576
sysctl -w net.ipv4.tcp_fin_timeout=15
node.process_limit = 2097152
node.max_ports = 1048576

2、客户端主机配置:
系统:亚马逊linux2
参数优化:
sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open
ulimit -n 1048576
echo “fs.file-max = 1048576” >> /etc/sysctl.conf
echo “DefaultLimitNOFILE=1048576” >> /etc/systemd/system.conf
echo “* soft nofile 1048576” >> /etc/security/limits.conf
echo “* hard nofile 1048576” >> /etc/security/limits.conf
sysctl -w net.core.somaxconn=32768
sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sysctl -w net.core.netdev_max_backlog=16384
sysctl -w net.ipv4.ip_local_port_range=‘1024 65535’
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.optmem_max=16777216
sysctl -w net.ipv4.tcp_rmem=‘1024 4096 16777216’
sysctl -w net.ipv4.tcp_wmem=‘1024 4096 16777216’
echo “net.core.somaxconn=32768” >> /etc/sysctl.conf
echo “net.ipv4.tcp_max_syn_backlog=16384” >> /etc/sysctl.conf
echo “net.core.netdev_max_backlog=16384” >> /etc/sysctl.conf
echo “net.ipv4.ip_local_port_range=1024 65535” >> /etc/sysctl.conf
echo “net.core.rmem_default=262144” >> /etc/sysctl.conf
echo “net.core.wmem_default=262144” >> /etc/sysctl.conf
echo “net.core.rmem_max=16777216” >> /etc/sysctl.conf
echo “net.core.wmem_max=16777216” >> /etc/sysctl.conf
echo “net.core.optmem_max=16777216” >> /etc/sysctl.conf
echo “net.ipv4.tcp_mem=16777216 16777216 16777216” >> /etc/sysctl.conf
echo “net.ipv4.tcp_rmem=1024 4096 16777216” >> /etc/sysctl.conf
echo “net.ipv4.tcp_wmem=1024 4096 16777216” >> /etc/sysctl.conf
sysctl -w net.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_max=1000000
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
echo “net.nf_conntrack_max=1000000” >> /etc/sysctl.conf
echo “net.netfilter.nf_conntrack_max=1000000” >> /etc/sysctl.conf
echo “net.netfilter.nf_conntrack_tcp_timeout_time_wait=30” >> /etc/sysctl.conf
sysctl -w net.ipv4.tcp_max_tw_buckets=1048576
echo “net.ipv4.tcp_max_tw_buckets=1048576” >> /etc/sysctl.conf
sysctl -w net.ipv4.tcp_fin_timeout=15
echo “net.ipv4.tcp_fin_timeout=15” >> /etc/sysctl.conf

压测工具:emqtt-bench
压测启动(两种方式都试过):
docker run --name client_1 --net=host --ulimit nofile=1000000:1000000 -itd emqx/emqtt-bench conn -h 主机内网ip -c 50000 --ifaddr 客户端ip
docker run --name client_1 --net=host --ulimit nofile=1000000:1000000 -itd emqx/emqtt-bench conn -h 主机内网ip -c 50000 -i 10 --ifaddr 客户端ip

客户端尝试过两种方式,如下
方式一:
5台客户端 每台配置 8核16G 每台分配4个网络接口,每台4个独立ip
使用docker每次启动5万个connect,每台总共20万,开启到第三台机器的时候,数量达到547244~547249之间的时候,数量不能再往上走,客户端报错
client(12): connect error - timeout
client(84): connect error - timeout
emqx本身日志无异常输出,系统message日志无异常输出

方式二:
2台客户端 一台16核32G 一台8核16G 每台1一个网络接口,每台10个ip
使用docker启动,16核32G启动10个脚本,8核16G再启动一个,数量达到547244~547249之间的时候,数量不能再往上走,客户端报错
client(12): connect error - timeout
client(84): connect error - timeout
emqx本身日志无异常输出,系统message日志无异常输出

附上微信群里的新建链接时的抓包截图,从这个截图看,像是 EMQX 没有响应 TCP 的握手

试着拿下以下信息

  1. 执行 emqx eval 'observer_cli:start()' 观察输出并完整截图附一下
  2. 分别执行下 emqx eval "esockd:get_current_connections({'tcp:default',{{0,0,0,0},1883}}). bin/emqx eval "esockd:get_max_connections({'tcp:default',{{0,0,0,0},1883}})." 看看输出
  3. 尝试下在 emqx 本机和客户端机器上都分别执行 telnet <your emqx host ip> 1883 看是否能连接上呢

top情况


ss -lnt情况

1、 执行 emqx eval 'observer_cli:start()'截图

3、telnet情况
(1)客户端telnet服务器1883,不通,自己用nc起一个8888,可以通
image

2.分别执行下 emqx eval "esockd:get_current_connections({'tcp:default',{{0,0,0,0},1883}}).bin/emqx eval 不出结果

emqx eval "esockd:get_current_connections({'tcp:default',{{0,0,0,0},1883}})."
emqx eval "esockd:get_max_connections({'tcp:default',{{0,0,0,0},1883}})."

3、telnet情况
(2)服务端本机telnet 1883可以通
image

2、执行emqx eval "esockd:get_current_connections({‘tcp:default’,{{0,0,0,0},1883}})."情况,返回:347246

执行emqx eval “esockd:get_max_connections({‘tcp:default’,{{0,0,0,0},1883}}).”
返回 1024000

那估计是网络or云服务商的问题了…给他们开开工单问下看。

因为,从其他信息上看和本机的 telnet 能通,表示 EMQX 的处理 TCP 连接的能力还在的

那我在服务器端开启连接再看看情况