跳至主要内容

使用 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%,则意味着其消费者有时无法接收消息。网络拥塞会限制您所能达到的利用率,或者低利用率可能是由于使用了过低的 预取限制 导致的,这会导致队列在消费者处理消息之前需要等待,直到它能够发送更多消息。

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

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

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

了解更多

进程已完成,退出代码为 0

© 2024 RabbitMQ. All rights reserved.