http_auth插件会创建大量tcp连接,状态为ESTABLISHED,会阻塞正常的http auth请求

环境信息

  • EMQ X 版本:4.3.7
  • 操作系统及版本:centos 7.6
  • 其他

问题描述

http_auth插件运行一段时间后,会出现无法正常发起http认证请求。
netstat -an 命令可以看到大量ESTABLISHED状态的TCP连接(100+)
在http的服务器端可以看到,只创建了连接,并没有发送数据(没有http协议)

配置文件及日志

在服务端看到的TCP连接,全是ESTABLISHED状态,但Recv Packets只的几个


使用wireshark抓包,只有tcp连接的包,没有正常的http请求:

@t1ger help~

能否提供一下 EMQ 的运行日志?目前看不出问题。

你的认证服务看下有没有别的服务在发起连接,现在不是很确定这些 TCP 连接是由谁发起的。EMQ X 底层 auth http 模块进程池是有数量限制的,理论上是不会大量链接占用的。你有改动配置线程池的数量吗?

没有在连接的客户端,刚才我把webhook的web.hook.enable_pipelining设置为false后,好像有好转,TCP连接上来后,会很快断开,但还是不断有TCP连接产生。
webhook的连接出了问题,竟然会影响http auth,为什么插件之间会相互影响呢

看起来是在竞争连接池。

webhook的web.hook.enable_pipelining设置为false后,http auth超时的现象暂时没有了,但看tcp连接情况,还是会不断创建tcp连接(创建-断开的速度很快,是http auth不断发起的)

通过wireshark抓包发现,不断有TCP连接过来,只建立连接,但不发送数据,TCP关闭是由web服务器主动断开的(配置了 connect timeout 为5秒)
暂时判断可能的原因是,http auth 的auth.http.enable_pipelining设置为false不生效。

请求了一次http后,tcp没有马上断开。
确定是auth.http.enable_pipelining = false没生效,webhook的enable_pipelining也没生效

如果是数量可控的 TCP 连接,是正常的业务操作,长链接免去重建连接的操作提高性能。

可以让这个参数生效吗,这样可以根据实际情况进行配置,
因为web服务器设置了tcp多久没有数据传输,就会关闭tcp连接。
同时,pipelining容易造成线头阻塞

您好,很抱歉没有及时回复您。

HTTP Pipelining 是指在没有收到响应前可以发出多个请求,如果你的服务器不支持这个特性,可能导致连接断开。

然后目前不管是 HTTP Server 认证还是 Webhook,为了提高性能,底层都是 TCP 长连接,这就是为什么你会看到我们建立了很多 TCP 连接但是没有发送 HTTP 请求。

同时我们有自动重连机制,如果连接断开,会不断重连。不过连接总数由配置文件中的 pool_size 配置项决定。

希望以上内容可以帮助到你。