emqx / emqtt-bench

Lightweight MQTT benchmark tool written in Erlang
https://www.emqx.com
Apache License 2.0
511 stars 132 forks source link

emqtt-bench压测时如何打印客户端的报文信息 #251

Open nuomi666 opened 1 month ago

nuomi666 commented 1 month ago

emqtt-bench发送qos2消息压测mqtt时,接收客户端报unexpected_PUBREL错误,mqtt服务器没有任何报错日志,想通过查看emqtt-bench客户端的报文日志来分析错误原因

zmstone commented 1 month ago

emqtt-bench 的客户端有一个默认重试的行为,如果一个消息发出去之后30秒还没有完成投递,客户端会尝试重传。 重传发生后,如果 EMQX 实际上已经回复了 PUBREL,再回复第二次的时候客户端就不认识,然后就出这个日志。

严格来说,会话内重传消息是违反协议的,所以在 EMQX 5.8 会把这个行为改掉。 emqtt-bench 的默认参数还没有改过来。可以尝试 --retry-interval 0 来关闭重传。

zmstone commented 1 month ago

https://github.com/emqx/emqtt-bench/pull/252

nuomi666 commented 1 month ago

emqtt-bench 的客户端有一个默认重试的行为,如果一个消息发出去之后30秒还没有完成投递,客户端会尝试重传。 重传发生后,如果 EMQX 实际上已经回复了 PUBREL,再回复第二次的时候客户端就不认识,然后就出这个日志。

严格来说,会话内重传消息是违反协议的,所以在 EMQX 5.8 会把这个行为改掉。 emqtt-bench 的默认参数还没有改过来。可以尝试 --retry-interval 0 来关闭重传。

目前 --retry-interval 参数是默认的0,依然会报 unexpected_PUBREL的警告,这个警告的出现原因会有哪些,emqtt-bench给与的日志太少了,分析不出来

zmstone commented 1 month ago

Sorry, 这个 PUBREL 是 EMQX 发给客户端的,表明是 EMQX 发生了重试,不是修改客户端参数,而是修改 EMQX 配置。

可以给 emqx.conf 配置 mqtt.retry_interval = infinity