EMQ调优可以参考官方文档
EMQ服务器配置:4核8G centos 7.x
EMQ版本:v3.1.0 docker部署 启用MySQL认证与鉴权 mysql docker部署 mysql和emq在同一台服务器
测试工具:官方提供的 mqtt benchmark tool github地址
一些说明:
【1】emq docker版本相关emq服务参数是已经调优过的可以不用关注,但是宿主机的调优还是有必要的
【2】mqtt benchmark tool 工具如果直接使用的话需要在安装erlang环境,比较麻烦,推荐使用docker版本,镜像地址
【3】压测工具的镜像pull下来以后直接run即可,然后通过 docker exec -it xxx bash 命令进入容器,进入容器后 cd emqtt_benchmark/ 进入项目文件夹,然后执行make 命令
【4】make 成功以后 就可以进行测试了,由于TCP协议的限制(tcp协议只有两字节存放源端口号),一台服务器向外部建立连接最多只能打开65536个端口,除去一些公知端口等 也就只能打开6w左右端口。因此准备了两台压测服务器,每个服务器启4个压测container,每个container建立1w个TCP连接,这样总共建立8W个TCP连接
【5】参考官方文档的压测参数说明进行压测,注意文档中貌似少了个下划线有误导
emqtt_bench sub 应该是 emqtt_bench_sub
可查看压测容器中emqtt_benchmark/ 目录下的 README.md 获取压测配置说明
压测工具错误说明
【1】{shutdown,eaddrnotavail} 测试服务器无法分配端口,我是用docker跑的,一个container大概建立1w3左右的TCP连接就会报这错误,建议一个container跑1w个TCP连接,多创建几个container,不要忽略了一台服务器最多能分配端口的数量
【2】{shutdown,connack_timeout} 连接超时,一般如果emq服务器每秒处理的建立连接请求过多就会出现这个错误,可适当调节每个连接请求间的间隔( -i 参数)
【3】{shutdown,econnrefused} 连接被拒绝,请检查测试工具与emq服务间是否能通信,检查emq服务器的IP是否正确,如果启用了认证个鉴权插件,请检查账号是否有权建立连接,-P 写的是密码明文 等
压测结果
【1】EMQ每秒可以处理多少个TCP连接请求和需要建立连接的总量有关,比如 压测工具只建立1w个TCP连接请求,那么EMQ服务器可能能支撑2000/s的请求量。不会出现连接超时的情况,2000/s不能表示服务器每秒可以稳定处理TCP连接请求的数量,在系统内核同时处理不了那么多请求时,会把多余的请求放入一个队列,如果队列也满了那个多余的连接就会被拒绝掉,不断的加大建立请求的总量可以找到服务器稳定处理TCP连接请求的是速率大概是多少
【2】本人压了8W的TCP连接,是因为业务基本不会超过8W的量,实际可能远远低于8w。因此,不代表EMQ服务器只能处理8w的量
【3】关于官网所说的在一台8核心、32G内存的 CentOS 服务器上MQTT 连接压力测试到130万,单纯的保持会话连接我觉得是可以达到的,但是实际业务往往更复杂,消息服务质量、网络环境、客户端是否会自动重连、客户端是否会cleanSession,topic发布的速率等等,要达到业务要求的压力测试肯定是没有那么多的,每个业务要求又不一样,因此需要针对业务要求进行针对性的压测这样得出的指标才比较靠谱