错误报告
环境
- EMQX 版本:5.0.17
- 操作系统版本:debian11
重现此问题的步骤
- 启动服务systemctl start emqx
- 开始使用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 - 数量到达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 的握手
试着拿下以下信息
emqx eval 'observer_cli:start()'
观察输出并完整截图附一下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}})."
看看输出telnet <your emqx host ip> 1883
看是否能连接上呢top情况
1、 执行 emqx eval 'observer_cli:start()'
截图
3、telnet情况
(1)客户端telnet服务器1883,不通,自己用nc起一个8888,可以通
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可以通
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 连接的能力还在的
那我在服务器端开启连接再看看情况