emqx连接压测出现消息发送失败和丢弃的情况相关咨询

环境

  • EMQX 版本:5.0.16 tar.gz 启动
  • 操作系统版本:Centos7 16核
  • 3台服务器进行集群+Haproxy

重现此问题的步骤

  1. 配置规则、数据桥接,将emqx 消息写入到TDengine库
  2. 进行模拟上报,测试消息流入速率和消费处理速率

预期行为

  1. 数据未丢失,全部写入到TDengine

实际行为

  1. Haproxy负载均衡是只把客户端接入进行负载均衡吗?单个客户端连接到负载均衡那边,实际处理消息的只是其中一个节点,发送处理的是不会进行负载均衡吗?如果开3个客户端,则会在不同节点进行处理。如下图,只开了一个客户端进行推送的时候:

  2. 消息在达到一段时间后2000/s 后,数据桥接那边出现消息丢失和失败的情况,后台记录错误日志如下


    非常多的error 出现

  3. 从报警那边观察到这 报错代表是桥接资源挂了吗?

  4. 发送成功的数量和实际写入TD的数量对应不上。写入的数量不止发送成功的数量,是否超期回复的也在算是写入成功?

问题咨询

  1. 想查出性能瓶颈在哪?是emqx 这边发送导致丢失和失败还是TDengine 那边接收的问题?不太好确认。错误日志在EMQX这边有出现,但是看不明白。能否帮忙分析下错误,定位下原因
  2. 企业版和开源版本性能差距在哪?消息流入流出处理速率上会差多少?
  3. 另外纯推送测试情况下,用jmeter进行连接测试,线程数大于300的时候就会有一定情况连接不上或者的推送失败的情况,也是定位不到原因
  1. LB 都是只负载连接的,而且也做不到把一个连接内的消息再负载到不同节点上去。
  2. 这个错误日志看起来是个 Bug,我这边已经反馈给技术团队跟进。
  3. resource_down 的意思是当前 EMQX 无法成功连接到外部资源,你可以检查当时外部资源的状态
  4. 我猜测是因为实际已经写入 TDEngine 了,但 EMQX 这边等待响应超时了,所以判断为写入失败。

大部分失败或者丢弃,这个问题是因为2的那个错误导致的吗?开源版本的写入速率和规则转出这个丢弃太多了

2里面提到的bug会导致丢请求,不过不能完全确定你目前这里丢请求全部都是这个导致的

@t1ger 你好,经过观察发现非常频繁的出现资源断了相关报警,这个是可能是集群中的某一个断了,是否影响写入?相关日志如下,只有一个连接断了,是否影响写入?另外咨询下,你们那边是否有做过相关测试验证,每次都出现很多错误或者问题,定位不到原因 :sob:


可能只是其中一个节点连接不上,但是集群未动情况

相关错误日志

资源断开的那个节点上的消息会暂时无法投递到 HTTP Server,不过这些消息会被缓存到队列,等到连接恢复就会继续投递。

日志的错误应该是连接不上,可以检查下那个节点和 HTTP Server 的网络。

局域网通信,目标是TDengine 的负载均衡NG那一侧的, 目前是没有发现不稳定现象,这个节点就是挺频繁的报这个连接不上问题 :face_exhaling:

这样的话可以抓个包看下具体的情况

@t1ger 你好,咨询下,这个持续这么久的是什么报错?

@t1ger 你好,上面这个警告能看出什么不?

这个告警是指对应的客户端可能处于消息比较慢的状态下,他会在 TCP 发送缓存区满的时候触发,所以也会和你设置的发送缓冲区大小有一定的关系。

@t1ger 这个客户端发送缓冲区,每个客户端都可以自己配置还是管理后台统一配置?在哪里配置这个缓冲区呢?

我们提供了 tcp_opts.sndbuf 这个配置项,你可以查阅一下 配置手册 文档。

@t1ger 在咨询下,在桥接那边桥接池,缓冲池对规则入库影响很大,但是文档中好像没找到相关配置介绍,默认配置情况下,设备数量一大的时候就会丢失和发送错误的问题,EMQX服务端一直报错之前提过的(unrecoverable error.emgx resource buffer xxxx)。

  1. 想了解下连接池、缓冲池分别作用于哪方?单个规则的时候是否有比较合适的值?
  2. 多个规则桥接情况下,桥接池、缓冲池总数是否有限制?比如连接池都配置成50,很多规则情况下,50*n 这个是否有限制?

  • 缓冲池(缓冲层) 是在资源层之上的一层,用来缓冲消息,如果资源处于断开状态,消息会被缓存在缓冲层了。一般是跟 CPU 核数一致,或者是 CPU 核数的倍数。
  • 连接池是在资源层里面的,用来提升发送消息的性能。一般是跟 CPU 核数一致,或者是 CPU 核数的倍数。
  • 这两个 pool size 都没有上限,但最好是 CPU 核数的倍数,这样才会获得更好的性能。

@Shawn @t1ger 你好,有一个疑问就是

  1. 比如16核的服务器,默认连接池是4,消息基本会失败或者丢失,如果改成32 或者 64 效果会好很多。那么每一条规则都可以按照这样的连接池数去配置吗?比如有100条规则桥接,每个规则都配置成32的连接池,是否对整体有影响?
  2. 另外测试发现版本一直刷这个错误,是和这边哪个配置相关,这个是导致推送失败的原因吗?

@t1ger @Shawn 你好,上面这个问题,关于连接池和缓冲池大小的配置,是否有总量的限制?比如每个规则都能按照最大的去配置,如果有限制总数限制大概是多少?

busy port 的错误是因为 emqx 往客户端发送消息的时候,发现 TCP 连接已经阻塞了。可能是客户端没有来得及处理。

reason: normal 那个我还没看出是什么问题来,需要调查一下。

对于连接池和缓冲池你的每一个规则都可以这样设置,没有上限。webhook 按经验是要把连接池设置大一些,缓冲池则没有具体要求。当然具体效果如何还是要看你的测试结果。

您好。我也遇到了数据桥接资源频繁断开问题。请问这个问题您解决了吗?

没有,挺久没关注这个了,不好意思,最新版本的不知道还会不会出现这个问题