RabbitMQ - 記憶體磁碟監控

HuDu發表於2021-06-09

1、RabbitMQ 記憶體警告

當記憶體使用超過配置的閾值或者磁碟空間剩餘空間低於配置的閾值時,RabbitMQ會暫時阻塞客戶端的連線,並且停止接收從客戶端發來的訊息,以此避免伺服器的奔潰,客戶端與服務端的心跳檢測機制也會失效。

如圖,如果出現 blockingblocked說明達到了閾值以及高負荷執行了

RabbitMQ - 記憶體磁碟監控

2、RabbitMQ 的記憶體控制

參考幫助文件:www.rabbitmq.com/configure.html
出現警告時候,可以通過配置去修改和調整

2-1、命令方式

$ rabbitmqctl set_vm_memory_high_watermark <fraction>
$ rabbitmqctl set_vmmemory_high_watermark absolute 4.8GB
# 或者
$ rabbitmqctl set_vmmemory_high_watermark 0.6
fraction/value 為記憶體閾值。預設情況是:0.4/2GB,代表的含義是:當RabbitMQ的記憶體超過40%時,就會產生警告,並且阻塞所有生產者的連線。通過此命令修改閾值在Broker重啟以後會失效,通過修改配置檔案方式設定的閾值則不會隨著重啟而消失,但修改配置檔案一樣要重啟

2-2、配置檔案方式 rabbitmq.conf

當前配置檔案位置:/usr/local/etc/rabbitmq/rabbitmq-env.conf

# 預設
# vm_memory_high_watermark.ralative = 0.4
# 使用 ralative 相對值進行設定fraction,建議取值在0.4~0.7之間,不建議超過0.7
vm_memory_high_watermark.ralative = 0.6
# 使用absolute的絕對值的方式,但是是KBMBGB對應的命令如下
vm_memory_high_watermark.absolute = 4.8G

3、 RabbitMQ 的記憶體換頁

在某個 Broker 節點及記憶體阻塞生產者之前,它會嘗試將佇列中的訊息換頁到磁碟以釋放記憶體空間,持久化和非持久化的訊息都會寫入磁碟,其中持久化的訊息本身就在磁碟中有一個副本,所以在轉移的過程中持久化的訊息會先從記憶體彙總清除掉。

預設情況下,記憶體大道的閾值是50%時就會換頁處理
也就是說,在預設情況下該記憶體的閾值是0.4的情況下,當記憶體超過0.2時,就會進行換頁動作。

比如有1000MB 記憶體,當記憶體的使用率達到了400MB 的極限,但是因為配置的換頁記憶體0.5,這個時候會在到極限400MB 之前,會把記憶體中的200MB 進行轉移到磁碟中。從而達到檔案執行
可以通過vm_memory_high_watermark_paging_ratio來進行調整

vm_memory_high_watermark.ralative = 0.4
vm_memory_high_watermark_paging_ratio = 0.7(設定值小於1)

為什麼設定值小於1,因為如果設定1閾值,記憶體都已經達到了極限,再去換頁的意義就不是很大了。

4、RabbitMQ 的磁碟警告

當磁碟的剩餘空間低於確定的閾值時,RabbitMQ同樣會阻塞生產者,這樣可以避免因非持久化的訊息持續換頁而耗盡磁碟空間導致服務奔潰

預設情況下:磁碟預警值為 50MB 的時候會進行預警,表示當磁碟空間小於 50MB 的時候會阻塞生產者並停止記憶體訊息換頁到磁碟的過程。
這個閾值可以減小,但是不能完全的消除因磁碟耗盡而導致的奔潰的可能性。比如在兩個磁碟空間的檢查空隙內,第一次檢查是60MB,第二次檢查可能就是1MB,就會出現警告。

通過如下命令方式修改

$ rabbitmqctl set_disk_free_limit <disk_limit>
$ rabbitmqctl set_disk_free_limit memory_limit <fraction>

disk_limit:固定單位 KB MB GB
fraction:是相對閾值,建議範圍在 1.0~2.0之間。(相對於記憶體)

通過配置檔案配置如下

disk_free_limit.relative = 3.0
disk_free_limit.absolute = 50MB
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章