Amazon MQ for RabbitMQ:高内存警报 - Amazon MQ
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon MQ for RabbitMQ:高内存警报

当 CloudWatch 指标 RabbitMQMemUsed 确定的代理内存使用率超过 RabbitMQMemLimit 确定的内存限制时,RabbitMQ 将会发出高内存警报。RabbitMQMemLimit 由 Amazon MQ 设置并且在考虑每个主机实例类型可用的内存情况下经过特别调整。

发出高内存警报的 Amazon MQ for RabbitMQ 代理将会阻止所有客户端发布消息。由于内存使用率高,您的代理可能还会遇到其他使警报诊断和解决复杂化的问题。

因内存使用率高而无法完成启动的单实例代理可能会遇到重新启动循环,在此过程中,与代理的交互将会受到限制。在集群部署中,队列可能会遇到不同节点上的副本之间的消息同步暂停问题。队列同步暂停将会阻止消息消耗队列,并且必须在解决内存警报问题时单独解决此问题。

Amazon MQ 在遇到高内存警报时不会重新启动代理,并且将会在该代理继续发出警报时返回 RebootBroker API 操作异常。

使用本部分中的信息帮助您诊断和解决代理发出的 RabbitMQ 高内存警报。

注意

在您采取必要的操作后,RABBITMQ_MEMORY_ALARM 状态可能需要几个小时才能清除。

注意

您不能将代理程序从 mq.m5. 实例类型降级为 mq.t3.micro 实例类型。如果您想降级,则必须删除代理程序并创建新的代理程序。

使用 RabbitMQ Web 控制台诊断高内存警报

RabbitMQ Web 控制台可以生成和显示每个节点的详细内存使用情况信息。您可通过以下操作查找此信息:

  1. 登录 Amazon Web Services Management Console 并打开代理的 RabbitMQ Web 控制台。

  2. 在 RabbitMQ 控制台上的 Overview(概览)页面,从 Nodes(节点)列表中选择一个节点名称。

  3. 在节点详细信息页面,选择 Memory details(内存详细信息)展开此部分以查看节点的内存使用情况信息。

RabbitMQ 在 Web 控制台中提供的内存使用情况信息可以帮助您确定哪些资源可能消耗过多资源并造成高内存警报。有关 RabbitMQ Web 控制台中可用的内存使用情况详细信息的更多信息,请参阅 RabbitMQ 服务器文档网站上的关于内存使用的推理

使用 Amazon MQ 指标诊断高内存警报

默认情况下,Amazon MQ 将会为您的代理启用指标。您可以通过访问 CloudWatch 控制台或者通过使用 CloudWatch API 查看您的代理指标。以下指标在诊断 RabbitMQ 高内存警报时非常有用。

Amazon MQ CloudWatch 指标 内存使用过高的原因
MessageCount 消息在被使用或丢弃之前一直存储在内存中。高消息计数可能指示资源过度使用,并且可能导致高内存警报。
QueueCount 队列存储在内存中,并且大量队列可能会导致高内存警报。
ConnectionCount 客户端连接使用内存,并且过多同时连接可能会导致高内存警报。
ChannelCount 与连接类似,使用每个连接建立的通道也会存储在节点内存中,并且大量通道可能会导致高内存警报。
ConsumerCount 对于连接至代理的每个使用者,一组消息在传输至使用者之前将从存储加载到内存。大量使用者连接可能造成高内存使用,并导致高内存警报。
PublishRate 发布消息将会使用代理的内存。如果消息发布到代理的速率过高并且大幅超过代理将消息传输到使用者的速率,则代理可能会遇到高内存警报。

解决高内存警报

对于您确定的每个因素,我们建议您采取以下操作来缓解和解决代理的高内存警报。

内存使用过高的原因 Amazon MQ 建议
队列中的消息数过高。 执行以下任一操作:
  • 使用发布到队列的消息。

  • 清除队列中的消息。

  • 删除代理中的队列。

在代理上配置的队列数过高。 减少队列数。
在代理上建立的连接数过高。 减少连接数。有关更多信息,请参阅减少连接和通道的数量
在代理上建立的通道数过高。 减少通道数。有关更多信息,请参阅 减少连接和通道的数量
连接到代理的使用者数过高。 减少连接到代理的使用者数。
消息发布速率过高。 降低发布商向代理发送消息的速率。
客户端连接尝试率过高。 降低客户端尝试连接到代理以便发布或使用消息或者配置代理的频率。

减少连接和通道的数量

至 Amazon MQ for RabbitMQ 代理的连接可通过客户端应用程序关闭,或者通过使用 RabbitMQ Web 控制台手动将其关闭。要使用 RabbitMQ Web 控制台关闭连接,请执行以下操作。

  1. 登录 Amazon Web Services Management Console 并打开代理的 RabbitMQ Web 控制台。

  2. 在 RabbitMQ 控制台上,选择 Connections(连接)选项卡。

  3. Connections(连接)页面的 All connections(所有连接)下,选择您想要从列表中关闭的连接名称。

  4. 在连接详细信息页面上,选择 Close this connection(关闭此连接)以展开此部分,然后选择 Force Close(强制关闭)。或者,您可以将 Reason(原因)的默认文本替换为您自己的描述。在您关闭连接时,Amazon MQ for RabbitMQ 将会向客户端返回您指定的原因。

  5. 选择对话框上的 OK(确定)以确认并关闭连接。

在您关闭连接时,与关闭的连接关联的任何通道也会关闭。

注意

您的客户端应用程序可配置为在关闭连接后自动重新建立至代理的连接。在此情况下,从代理 Web 控制台关闭连接可能不足以减少连接或通道计数。

对于没有公共访问的代理,您可以通过拒绝相应消息协议端口(例如,AMQP 连接的端口 5671)上的入站流量来临时阻止连接。创建代理时,您可以阻止您向 Amazon MQ 提供的安全组中的端口。有关修改安全组的更多信息,请参阅 Amazon VPC 用户指南中的向安全组添加规则

解决集群部署中的队列同步暂停问题

解决 RabbitMQ 的高内存警报时,您可能会发现无法使用一个或多个队列上的消息。这些队列可能正处于节点之间消息同步过程中,在此过程中,相应的队列可能无法用于发布和使用。队列同步可能因高内存警报暂停,甚至可能造成内存警报。

有关停止和重试暂停队列同步的信息,请参阅 解决 RabbitMQ 暂停队列同步的问题

解决单实例代理中的重新启动循环问题

如果发出高内存警报的 Amazon MQ for RabbitMQ 单实例代理重新启动且没有足够的内存启动,则可能会存在不可用风险。这可能会导致 RabbitMQ 进入重新启动玄幻,并且在问题解决之前阻止与代理的任何进一步交互。如果您的代理处在重新启动循环中,则您将无法应用本部分前面描述的 Amazon MQ 建议操作,以解决高内存警报。

要恢复您的代理,我们建议升级到具有更高内存的更大实例类型。与在集群部署中不同,您可以在遇到高内存警报时升级单实例代理,因为在重新启动过程中节点之间没有任何要执行的队列同步。

防止高内存警报

对于您确定的每个起作用的因素,我们建议执行以下操作,以防止和减少 RabbitMQ 高内存警报的发生。

高内存使用率原因 Amazon MQ 建议
队列中的消息数过高。 执行以下操作:
在代理上配置的队列数过高。 设置或降低队列计数限制
在代理上建立的连接数过高。 设置或降低连接计数限制
在代理上建立的通道数过高。 设置客户端应用程序上的每个连接的最大通道数。
连接到代理的使用者数过高。 设置一个小的使用者预提取限制
客户端连接尝试率过高。 使用长期连接来降低连接尝试的数量和频率。

代理的内存警报解决之后,您可以将主机实例类型升级为包含其他资源的实例。有关如何更新代理的实例类型的信息,请参阅 Amazon MQ REST API 参考中的 UpdateBrokerInput

有关代理实例类型的完整列表,请参阅 Amazon MQ for RabbitMQ 实例类型