mqtt客户端发布消息吞吐量低的问题

EMQX 版本

EMQX V5.3.2

EMQX 安装部署方式

通过docker部署

EMQX 集群情况

未使用集群

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

8核4G

服务器操作系统和平台

Ubuntu20.04 x64

问题描述

服务端使用,压测一切正常。
客户端为 C++平台 使用paho.mqtt.cpp库进行连接和消息的发布。
测试采用单线程循环发布,当发布消息qos为0时,每秒发布消息为3000-4000。
当发布消息qos为1时,每秒发布消息条数为400左右。
当发布消息qos为2时,每秒发布信息条数为200左右。

请问这个性能是否正常

QoS1 和 QoS2 的消息需要等待 ACK,所以感觉是正常的。单个 MQTT 连接的吞吐不会很高,需要你增加 MQTT 连接数才能达到高吞吐的目的。

QOS 1只是多了一个PUBACK包,但是TPS却下降到了原来的大约1/10,这是什么原因?

  • 我理解你的场景是单个 MQTT 连接向 emqx 发送数据,没有订阅者,测试单个连接最大的吞度,对吗?

  • emqx 有没有开启任何鉴权或者数据集成的插件和功能?

  • 网络环境是内网、公网,还是客户端跟 emqx 在同一台机器上?

很可能是因为客户端在等待服务端应答 PUBACK。emqx 每收到一个 qos1 报文都会立即回复 PUBACK,至于为什么每秒只能有 400 个,你可以查看一下是否 emqx 已经出现瓶颈:

emqx eval 'observer_cli:start()'

然后输入 mq 回车。如果出现 message queue 比较大的进程说明已经有瓶颈。

如果没有瓶颈,可能还是 MQTT 流程的影响:客户端每发送一个 PUBLISH 报文,都需要等待一个 PUBACK,会极大降低整个交互的吞吐,通过增大客户端的 Inflight window,可以减轻这个问题。可能是这个:Paho MQTT C Client Library: MQTTClient_connectOptions Struct Reference