Amazon MQ for RabbitMQ:高記憶體警示 - Amazon MQ

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon MQ for RabbitMQ:高記憶體警示

當代理程式的記憶體用量以 CloudWatch 指標 識別RabbitMQMemUsed、超過 識別的記憶體限制時,RabbitMQ 將發出高記憶體警示RabbitMQMemLimitRabbitMQMemLimit 是由 Amazon MQ 設定,並已考量每個主機執行個體類型可用的記憶體進行特別調校。

發出高記憶體警示的 Amazon MQ for RabbitMQ 代理程式將阻止所有正在發佈訊息的用戶端。由於記憶體用量較高,您的代理程式還可能遇到其他問題,這些問題會讓警示的診斷和解決複雜化。

由於記憶體用量較高而無法完成啟動的單一執行個體代理程式可能會進入重新啟動迴圈,在此期間,與代理程式的交互會受到限制。在叢集部署中,佇列可能會遇到不同節點上之複本之間的訊息同步暫停。暫停的佇列同步可防止佇列訊息取用,必須在解決記憶體警示時單獨進行解決。

Amazon MQ 不會重新啟動發生高記憶體警示的代理程式,只要代理程式繼續發出警示,就會傳回RebootBrokerAPI操作的例外狀況。

使用本區段中的資訊可協助您診斷和解決代理程式發出的 RabbitMQ 高記憶體警示。

注意

在您採取必要的動作之後,RABBITMQ_MEMORY_ALARM 狀態可能需要數小時才能清除。

注意

您不能將代理程式從 mq.m5. 執行個體類型降級至 mq.t3.micro 執行個體類型。如果您希望降級,則必須刪除您的代理程式,並建立一個新的。

使用 RabbitMQ Web 主控台診斷高記憶體警示

RabbitMQ Web 主控台可以產生並顯示每個節點的詳細記憶體用量資訊。您可以透過以下操作找到此資訊:

  1. 登入 AWS 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 推薦
佇列中的訊息數量過多。 執行下列任何一項:
  • 取用已發佈到佇列的訊息。

  • 從佇列清除訊息。

  • 從您的代理程式中刪除佇列。

代理程式上設定的佇列數量過多。 減少佇列數量。
建立於代理程式上的連線數量過多。 減少連線數量。如需詳細資訊,請參閱減少連線和通道的數量
建立於代理程式上的通道數量過多。 減少通道數量。如需詳細資訊,請參閱減少連線和通道的數量
連線至代理程式的取用者數量過多。 減少連線至代理程式的取用者數量。
訊息發佈率過高。 降低發佈者傳送訊息至代理程式的速率。
用戶端連線嘗試率過高。 降低用戶端嘗試連線至代理程式以發佈或取用訊息或設定代理程式的頻率。

減少連線和通道的數量

您可以透過用戶端應用程式或透過使用 RabbitMQ Web 主控台手動關閉其來關閉您的 Amazon MQ for RabbitMQ 代理程式連線。若要關閉連線,請使用 RabbitMQ Web 主控台執行以下操作。

  1. 登入 AWS 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 參考 UpdateBrokerInput 中的 。 Amazon MQ REST API

如需代理程式執行個體類型的完整清單,請參閱 Amazon MQ for RabbitMQ 執行個體類型