环境信息
- EMQX 版本:4.2.14
- 操作系统及版本:centos7.9
- 其他
问题描述
最近压测(1500台设备发送信息/s)发现emqx转发有存在1s情况(鉴权是httpauth)和发送大文件(100m)设备掉线情况,怀疑是不是设备tcp上面的哪个参数限制住了这个: listener.tcp.external.acceptors”是不是影响接收速率,“ listener.tcp.external.active_n”是不是影响持续发送大文件,太大会踢掉
最近压测(1500台设备发送信息/s)发现emqx转发有存在1s情况(鉴权是httpauth)和发送大文件(100m)设备掉线情况,怀疑是不是设备tcp上面的哪个参数限制住了这个: listener.tcp.external.acceptors”是不是影响接收速率,“ listener.tcp.external.active_n”是不是影响持续发送大文件,太大会踢掉
listener.tcp.external.acceptors 是指 接收 链接的处理器,越高约快,但是一般和CPU核数一样就行了。
listener.tcp.external.active_n 是指一次性异步的从 Socket 上拿多少消息。
但这些都不影响呢上面这个现象的。
主要看看有什么断开连接相关的日志?
通信是一个很复杂的过程,首先在TCP的底层,一个包最大只有1.5K左右,这是TCP底层的限制,超出这个大小的数据包会被分割发送。另外,MQTT的SDK发送缓冲区也有这个限制,大多数情况下,如果超出SDK发送缓冲区限制的话, 会溢出。MQTT会断线重连,当然,这也看这个SDK如何设计处理。大多数都是直接重连。要发送大数据的话,最好自己来划分数据包,不要依赖SDK,有点不太可靠。还有的就是,SDK内部,会有发送是否成功的内部逻辑沟通,这是和服务器交接的。假如没有返回结果前,继续向发送缓冲区写入数据,有可能会引起SDK内部的纠错处理。反正,就是比较复杂,涉及的方面太多。另外,服务器转发消息会延时,这个和服务器的硬件配置网络性能也有关系,可以仔细排查。
奇怪的是有的查询一直不掉线,有的一查就掉线,,奇怪了,,,对了,这个“MQTT的SDK发送缓冲区”,指的是mqtt内部吗?