EMQX工作节点负载不均衡问题解密

张开发
2026/4/17 7:34:21 15 分钟阅读

分享文章

EMQX工作节点负载不均衡问题解密
环境简述华为云ECS-debian12自建k8s集群EMQX 5.53core3replicant场景描述巡查EMQX时发现三个工作节点时发现部署了3个replicant的服务器其中一台负载一骑绝尘的高略微夸张就很不平均有点刺挠。明明每个节点的连接数都差不多1万4为什么你的负载会这么高是服务器有什么问题还是我的EMQ集群出了什么幺蛾子排查服务器检查先top一下第一就是beam.smpEMQX 主进程Erlang 虚拟机 SMP 版。beamErlang 虚拟机BEAM负责运行 EMQX 全部业务逻辑连接、消息路由、订阅、QoS、集群等。smpSymmetric Multi-Processing多核并行调度让 EMQX 能利用服务器所有 CPU 核心。你看到的 PID 63586、135.9% CPU就是 EMQX 主进程在消耗 CPU完全正常。所以大头还是在EMQ上容器资源检查kubectl top pod -n xdao --sort-bycpu前几个大头也确实是这个节点上的。。。但是emqx-replicant这个节点上的容器对比其他的节点高出了一倍所以进容器查查吧emqx-replicant状态检查# 看客户端连接 ./bin/emqx ctl clients list | head -20 # 看统计信息 ./bin/emqx ctl broker stats # 看消息收发 ./bin/emqx ctl broker metrics | grep message真凶 1messages.delivered 巨大messages.delivered : 356,406,0613.5 亿条消息投递这是最吃 CPU的操作主题匹配消息路由会话下发QoS 处理这个数值比另外两个节点高很多CPU 自然高。真凶 2messages.forward 巨大跨节点转发messages.forward : 76,972,5367600 万 跨节点转发这是EMQX 集群 CPU 消耗第二大的来源。只要一个节点负责大量转发CPU 直接翻倍。真凶 3大量消息被丢弃无订阅者messages.dropped.no_subscriber: 191,995,5301.9 亿条消息发出去没人订阅这些消息依然要经过主题匹配、路由计算、权限检查全部都耗 CPU但不会体现连接数里原因总结EMQX 集群是去中心化路由会出现其中一个节点成为消息路由中枢 转发桥头堡它要做接收所有设备上报计算主题路由转发消息给其他节点投递消息给订阅者处理大量无效消息no_subscriber另外两个节点只需要收消息不用路由、不用转发 → CPU 低分析完成集群正常CPU 差异是消息转发导致的不是故障松了一口气。

更多文章