emqx 使用 JMeter测试连接数只能到1.6万左右

EMQX 版本

5.0.21

EMQX 安装部署方式

安装包

EMQX 集群情况

单台机器

服务器(运行 EMQX 的机器)硬件配置

4核(vCPU) 16 GiB

服务器操作系统和平台

centos 8

服务端参数优化情况

net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

see details in Linux系统常用内核网络参数介绍与常见问题处理_云服务器 ECS-阿里云帮助中心

net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
fs.file-max = 1048576
net.ipv4.ip_local_port_range = 1024 65535

允许最大并发连接数,重要

net.core.somaxconn = 32768

SYNC等待队列长度,适当,太大了排队也没用

net.ipv4.tcp_max_syn_backlog = 16384

ACCEPT等待队列长度,适当,太大了堆积也无用

net.core.netdev_max_backlog = 16384

TCP 缓冲区内存,连接数达到非常高时候需要配置好

#net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_rmem = 1024 4096 16777216
net.ipv4.tcp_wmem = 1024 4096 16777216

socket缓冲区默认值和最大值

net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.optmem_max = 16777216

net.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30

net.ipv4.tcp_max_tw_buckets = 1048576

压力机硬件配置

本地电脑16g

压力机使用的测试工具

jemeter

压力机参数优化情况

在 EMQX 中启用的功能

未启用

测试场景

使用jemeter 做连接测试 1w次连接 只能成功5000次,最多连接1.6w,客户端频繁报错
在连接数达到1.6w时 ,在使用jemeter连接时异常率达到98%

具体问题

连接数过大,系统会崩掉 过会又好

jmeter 截图中的 EMQX Dashboard 看起来是 EMQX 4.x 版本。请您重新确认一下。
另外还请您收集一下压力测试过程中的日志以供详细调查。

jemeter 5.0.21和4.4都测试了
都是一样的效果

1w次连接 只能成功5000次

windows 中主动发起连接的可用端口数量应该也是 5000,应该需要调优一下 windows 配置

你线程组里的 Ramp-Up Period (in seconds) 值有设置过吗?如果没有设置过的话,一下子打到服务器端的连接数过多,会有问题的。具体你可以参考 JMeter入门教程 - 简书 中对于 Ramp-Up Period (in seconds) 的描述。一般来说最好每秒打到 emqx 的连接数不要超过 10k/s。

另外建议您看一下这篇文章:JMeter测试配置优化指南 - 简书
JMeter 最好在 Linux 上运行,并对 JMeter 这边也需要做一些参数优化。



我查看 发现到了5000连接后 就会故障

现在连接数可以上到3w多了,但是我设置1w个线程10秒钟连上 ,还是会失败4000多个连接

建议您到 Linux 上运行


本机压测1w确实没问题

我还是想请问下 为什么ssl压测就不行了,linux使用jemeter tcp可以1w。但是ssl的话1w只能连接一半

我是走nginx检验ssl转发到tcp的