EMQX开源版5.0.20 CPU占用高问题

EMQX 版本

EMQX 5.0.20

EMQX 安装部署方式

ubuntu 22.04 apt 安装

EMQX 集群情况

未使用集群,仅单节点;

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

32核 64GB,虚拟机

服务器操作系统和平台

Ubuntu 22.04, amd64

服务端参数优化情况

按照官网介绍优化配置,例如:

sysctl -w net.core.somaxconn=32768

sysctl -w net.ipv4.tcp_max_syn_backlog=16384

sysctl -w net.core.netdev_max_backlog=16384

2 millions system-wide

sysctl -w fs.file-max=2097152
sysctl -w fs.nr_open=2097152
echo 2097152 > /proc/sys/fs/nr_open

压力机硬件配置

例如,8核 16GB,虚拟器,10台

压力机使用的测试工具

emqtt_bench 进行50万订阅链接,1个主题
MQTTX 进行单条消息发送

压力机参数优化情况

系统参数修改情况,例如:

sysctl -w net.ipv4.ip_local_port_range=“1024 65535”

echo 1000000 > /proc/sys/fs/nr_open

ulimit -n 100000

在 EMQX 中启用的功能

基础功能测试,未启动认证等功能

测试场景

10台虚拟机 ,配置8核 16G模拟客户端,建立50万订阅消息,

本地PC ,采用MQTT X工具,建立1个链接,发布1条消息

具体问题

EMQX服务端CPU占用100%,通过EMQX管理界面查看消息流程速率,峰值1000+

咨询下CPU占用过高的原因是什么???

消息流出速度为什么这么低是因为CPU占用高导致的吗??
image

后台告警信息

消息流出监控

客户端资源消耗不高

MQTTX 模拟消息发布

你的场景是一个publisher 发消息给50万subscribers?

是的,按官网的介绍不应该这么慢才对

50万subscribers同时消费,CPU占用是会比较高。你在emqx dashboard看的消息流出峰值是经过10s平均的。
你可以重新测一下(先重启emqx清一下数据),发1条消息然后持续关注CPU占用,看下高占用大概持续多久,然后降下来后从dashboard确认一下发出的消息是不是有50万条。

是吧emqx dashboard看到的消息发出累加起来吗?是发了有50万条的,大概6分钟,这个速率算下来,每秒1400+左右,不算正常吧


第二遍测试,也只发1条消息,CPU高占用大概也在6分钟左右,消息发送完毕后,CPU负载也在10/15/10

我看 swap 开着 是不是没有调优过操作系统?Tuning Guide | EMQX 3.0 Documentation

swap这个没关(官网也上没这个建议),其他的服务器参数优化都是参考官网优化过的
image

能看出是什么问题吗?

我们会在自己的环境上试着重现一下问题,后面会在此帖子上更新。

我在aws上用了1台16C32G的云主机(c5.4xlarge)测试了这个场景,操作系统同样是ubuntu 22.04。EMQX version 5.0.20.

1个发布客户端,50万订阅端,发布端每隔1分钟发一条QoS 0的消息,payload 50字节。没有重现你的问题,我这里看到的是每次1条消息发出去,50万客户端瞬时全部收到该消息。从EMQX dashboard观察到的峰值有近7万,CPU一直用的不多,我截了一张top监控到的峰值,同时也附上持续的CPU监控截图。



补充:EMQX使用的是默认配置,没有做任何调优,操作系统按官网优化。

5.0 默认连接速率是 1000/s,超过这个速率后续连接会被推迟或者被拒绝,我怀疑是这个原因

连接速率应该不是问题,测试场景是在都连接上的情况下发,发布消息的场景。也测试过增加连接速率的场景,这个不影响消息发布
image

好的,我再检查下,看看是不是服务器原因。

客户端也是用的emqtt_bench吧

我使用的是XMeter,有另一个同事之前用emqtt_bench跑过,CPU也没有这么高。你把swap关掉试试呢。