先查 stats.enable。它关闭时,clients list 和客户端详情里的 recv_msg、send_msg、inflight 会一直是初始值,但全局 broker metrics 仍然正常计数,这正好符合“所有客户端都是 0、全局流出却持续增长”的现象。
执行:
/usr/bin/emqx ctl conf show stats
如果输出是 enable = false,前面用 inflight=0 排除重传的结论就没有依据。即使为 true,5.5.0 的连接统计也是异步刷新的,默认可能滞后约 15 秒;这次两份客户端快照只隔了约 12.8 秒,也不足以排除重传。
这批全局指标仍然指向 QoS 1 未确认:
messages.qos1.sent增加 15,495;messages.acked和packets.puback.received都只增加 2;messages.delivered、messages.sent同时增加 15,542。
也就是发出了约 1.55 万个 QoS 1 PUBLISH,只收到 2 个 PUBACK。EMQX 重传时 messages.delivered 也会增长,不能据此判断为纯订阅扇出。
先把 conf show stats 的完整输出贴出来。若统计已开启,下一次曲线上升时把采样窗口拉到 40 秒,覆盖一次默认 30 秒重传周期:
out="/tmp/emqx-flow-long-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$out"
for i in 1 2 3; do
date -Ins > "$out/time.$i.txt"
/usr/bin/emqx ctl broker metrics > "$out/metrics.$i.txt"
/usr/bin/emqx ctl clients list | sort > "$out/clients.$i.txt"
[ "$i" = 3 ] || sleep 20
done
diff -u "$out/metrics.1.txt" "$out/metrics.3.txt" > "$out/metrics.diff.txt" || true
diff -u "$out/clients.1.txt" "$out/clients.3.txt" > "$out/clients.diff.txt" || true
tar -czf "$out.tgz" -C "$(dirname "$out")" "$(basename "$out")"
echo "$out.tgz"
你贴的单客户端页面只显示 8 个接收 TCP 报文、1 个流入 PUBLISH,说明那个连接本身不是当前主要收发对象。新的 clients.diff.txt 重点看哪些客户端的 delivered_msgs、inflight 在增长;这才能定位是哪批订阅端没有回 PUBACK。


