Amazon MQ for RabbitMQ:高内存警报
当代理的内存使用量(由 CloudWatch 指标 RabbitMQMemUsed 标识)超过内存限制(由 RabbitMQMemLimit 标识)时,Amazon MQ for RabbitMQ 将引发高内存警报。
引发高内存警报的 RabbitMQ 代理将阻止所有发布消息的客户端。您的代理可能会进入重启循环,经历队列同步暂停,或出现其他使警报诊断和解决复杂化的问题。
要诊断和解决高内存警报,请首先遵循所有适用于 RabbitMQ 的最佳实践,然后完成以下步骤。
重要
-
RabbitMQMemLimit由 Amazon MQ 设置,并针对每个主机实例类型的可用内存进行了专门调整。 -
Amazon MQ 在遇到高内存警报时不会重新启动代理,并且将会在该代理继续发出警报时返回
RebootBrokerAPI 操作异常。
步骤 1:诊断高内存警报
有两种方法可以诊断 Amazon MQ for RabbitMQ 代理上的高内存警报。我们建议您同时检查 RabbitMQ Web 控制台和 CloudWatch 中的 Amazon MQ 指标。
使用 RabbitMQ Web 控制台诊断高内存警报
RabbitMQ Web 控制台可以生成和显示每个节点的详细内存使用情况信息。您可通过以下操作查找此信息:
-
登录 AWS 管理控制台 并打开代理的 RabbitMQ Web 控制台。
-
在 RabbitMQ 控制台上的 Overview(概览)页面,从 Nodes(节点)列表中选择一个节点名称。
-
在节点详细信息页面,选择 Memory details(内存详细信息)展开此部分以查看节点的内存使用情况信息。
RabbitMQ 在 Web 控制台中提供的内存使用情况信息可以帮助您确定哪些资源可能消耗过多资源并造成高内存警报。有关通过 RabbitMQ Web 控制台获取的内存使用量详细信息,请参阅 RabbitMQ 服务器文档网站上的内存使用分析
使用 Amazon MQ 指标诊断高内存警报
默认情况下,Amazon MQ 将会为您的代理启用指标。您可以通过访问 CloudWatch 控制台或者通过使用 CloudWatch API 查看您的代理指标。以下指标在诊断 RabbitMQ 高内存警报时非常有用。
| Amazon MQ CloudWatch 指标 | 内存使用过高的原因 |
|---|---|
MessageCount |
消息在被使用或丢弃之前一直存储在内存中。高消息计数可能指示资源过度使用,并且可能导致高内存警报。 |
QueueCount |
队列存储在内存中,并且大量队列可能会导致高内存警报。 |
ConnectionCount |
客户端连接使用内存,并且过多同时连接可能会导致高内存警报。 |
ChannelCount |
与连接类似,使用每个连接建立的通道也会存储在节点内存中,并且大量通道可能会导致高内存警报。 |
ConsumerCount |
对于连接至代理的每个使用者,一组消息在传输至使用者之前将从存储加载到内存。大量使用者连接可能造成高内存使用,并导致高内存警报。 |
PublishRate |
发布消息将会使用代理的内存。如果消息发布到代理的速率过高并且大幅超过代理将消息传输到使用者的速率,则代理可能会遇到高内存警报。 |
步骤 2:处理和防止高内存警报
注意
在您采取必要的操作后,RABBITMQ_MEMORY_ALARM 状态可能需要几个小时才能清除。
遵循所有 RabbitMQ 的最佳实践作为常规预防方法。对于您识别的每个具体影响因素,我们推荐采取以下系列措施来应对和预防 RabbitMQ 高内存警报。
| 高内存使用来源 | Amazon MQ 处理建议 | Amazon MQ 预防建议 |
|---|---|---|
| 消息数量 | 消费发布到队列的消息、清空队列中的消息或从代理中删除队列。 | 启用惰性队列,并设置或降低队列深度限制。 |
| 队列数 | 减少队列数。 | 设置或降低队列数量限制。 |
| 连接数 | 减少连接数。 | 设置或降低连接数限制。 |
| 通道编号 | 减少通道数。 | 设置客户端应用程序上的每个连接的最大通道数。 |
| 消费者数 | 减少连接到代理的使用者数。 | 设置一个小的使用者预提取限制。 |
| 消息发布速率 | 降低发布商向代理发送消息的速率。 | 开启发布者确认。 |
| 客户端连接尝试速率 | 降低客户端尝试连接到代理以便发布或使用消息或者配置代理的频率。 | 使用长期连接来降低连接尝试的数量和频率。 |
代理内存警报解决后,您可以将主机实例类型升级到具有更多资源的实例。有关如何更新代理实例类型的信息,请参阅《Amazon MQ REST API 参考》中的 UpdateBrokerInput。
注意
您不能将代理从 mq.m5.x 实例类型降级到 mq.t3.micro 实例类型。要降级,必须删除代理并创建新代理。