跳到主要内容

查找 RabbitMQ 3.3 的瓶颈

·4 分钟阅读
Simon MacMullen

RabbitMQ 3.3 的目标之一是让您能够更轻松地找到运行系统中的瓶颈。旧版本的 RabbitMQ 可以让您看到自己受到了速率限制,但不容易让您看到原因。在这篇博文中,我们将讨论 3.3 版本中的一些新的性能指标。

理解流控制

自从在 RabbitMQ 2.8.0 中引入流控制以来,您已经能够看到连接何时进入流控制状态。这(大致)意味着客户端正在被速率限制;它想要更快地发布,但服务器无法跟上。当然,您接下来想问的问题是“为什么?”。

流控制机制一直延伸到整个服务器;不仅连接,通道和队列也可能处于流控制状态,这意味着它们想要更快地发布消息,但它们前面的某些东西无法跟上。因此,要理解新的流控制信息,您需要知道如果任何组件发布到的目标是瓶颈 - 或者本身处于流控制状态,则该组件将进入流控制。组件处理进入服务器的消息的顺序是

网络
   ↓
连接进程 - AMQP 解析,通道多路复用
   ↓
通道进程 - 路由,安全,协调
   ↓
队列进程 - 内存消息,持久队列索引
   ↓
消息存储 - 消息持久性

那么可能的结果有哪些?

  • 连接处于流控制状态,但其任何通道都不处于流控制状态 - 这意味着一个或多个通道是瓶颈;服务器在通道执行的某些操作上受 CPU 限制,可能是路由逻辑。这最有可能在发布小型瞬态消息时看到。
  • 连接处于流控制状态,其某些通道处于流控制状态,但其发布的任何队列都不处于流控制状态 - 这意味着一个或多个队列是瓶颈;服务器要么在将消息接受到队列中时受 CPU 限制,要么在将队列索引写入磁盘时受 I/O 限制。这最有可能在发布小型持久消息时看到。
  • 连接处于流控制状态,其某些通道处于流控制状态,并且其发布的某些队列也处于流控制状态 - 这意味着消息存储是瓶颈;服务器在将消息写入磁盘时受 I/O 限制。这最有可能在发布较大的持久消息时看到。

消费者利用率

因此,希望您现在可以更好地了解服务器发布端的性能。那么消费端呢?流控制机制没有扩展到消费者,但我们有一个新的指标来帮助您了解消费者的工作强度。

该指标是消费者利用率消费者利用率的定义是队列的消费者可以接收新消息的时间比例。因此,它是一个从 0 到 1 的数字,或 0% 到 100%(如果队列没有消费者,则为 N/A)。因此,如果队列的消费者利用率为 100%,那么它永远不需要等待其消费者;它总是能够尽可能快地将消息推送给他们。

如果其利用率低于 100%,则意味着其消费者有时无法接收消息。网络拥塞可能会限制您可以实现的利用率,或者低利用率可能是由于使用了过低的 prefetch limit,导致队列需要等待,同时消费者处理消息,直到它可以发送更多消息。

下表显示了我在本地主机上使用单个消费者消费微小消息时观察到的一些消费者利用率的近似值

预取限制消费者利用率
114%
325%
1046%
3070%
100074%

您可以看到,利用率随着预取限制的增加而增加,直到我们达到大约 30 的限制。之后,网络带宽限制开始占主导地位,增加限制不再有好处。因此,您可以看到消费者利用率是监控我们消费者性能的简便方法。

了解更多

进程以退出代码 0 结束

© . All rights reserved.