emq5.6.1开源版负载高问题

EMQX 版本

5.6.1版本

EMQX 安装部署方式

ecs服务器上直接解压运行

EMQX 集群情况

3 个节点组成集群

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

4核 8GB AMD

服务器操作系统和平台

Rocky Linux release 9.3 (Blue Onyx)

在 EMQX 中启用的功能

设备连接到mqtt集群,然后平台共享订阅设备发布的消息,进行集群处理。

具体问题

mqtt节点负载规律性的波动,大概80分钟左右。 单cpu,内存,io,网络都无波动。见图

图里是系统平均负载周期性抬高,但你说 CPU、内存、IO、网络都没同步波动,单靠这张图还不能判断是 MQTT 吞吐导致的。

先在一个峰值和一个低谷各抓一次,三台节点都抓:

date
uptime
pidof beam.smp
ps -eo pid,ppid,stat,comm,wchan:32,pcpu,pmem --sort=-pcpu | head -30
pidstat -durwt -p $(pidof beam.smp) 1 20
./bin/emqx ctl vm load
./bin/emqx ctl vm all
./bin/emqx ctl broker stats
./bin/emqx ctl broker metrics | egrep 'client\.|session\.|messages|packets|delivery|dropped|overload'
grep -E 'long_schedule|long_gc|large_heap|busy_(dist_)?port|alarm|overload|mnesia' log/emqx.log* | tail -200

重点看:

  1. STAT=DR 的进程是不是周期性增加。Linux load average 看的是 runnable/D-state 队列,不等同于 CPU 使用率。

  2. EMQX 同时刻有没有 long_schedulelong_gcbusy_dist_port,以及消息、订阅、共享订阅指标是否突增。EMQX 的 sysmon 事件正好用来定位调度、GC、端口阻塞这类问题。

如果这些都平,再查系统侧 80 分钟周期任务:

systemctl list-timers --all
grep -R -E "emqx|logrotate|backup|updatedb" /etc/cron* /var/spool/cron 2>/dev/null

另外补一下峰值时的连接数、订阅数、共享订阅组数量、消息速率/QoS、三台节点各自的图。现在的信息还不足以判断是共享订阅均衡、集群分布端口,还是系统定时任务。

如果以上都没有问题,建议搭建一下 Prometheus 监控: