使用 RabbitMQ 3.3 查找瓶颈
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%,则意味着其消费者有时无法接收消息。网络拥塞会限制您能达到的利用率,或者低利用率可能是由于使用了过低的 预取限制,导致队列需要等待消费者处理完消息才能发送更多消息。
下表显示了我使用单个消费者在本地主机上消费微小消息时观察到的消费者利用率的近似值
| 预取限制 | 消费者利用率 |
|---|---|
| 1 | 14% |
| 3 | 25% |
| 10 | 46% |
| 30 | 70% |
| 1000 | 74% |
您可以看到,随着预取限制的增加,利用率也会增加,直到我们达到大约 30 的限制。此后,网络带宽限制开始占主导地位,增加限制不再带来任何好处。因此,您可以看到消费者利用率是我们监控消费者性能的简单方法。
了解更多
- 网络研讨会:RabbitMQ 3.8 有哪些新特性?
- 网络研讨会:使用 RabbitMQ 的开发者应该知道的 10 件事
进程以退出码 0 完成