RabbitMQ持久化與內存管理

持久化機制

RabbitMQ的持久化分爲消息持久化、隊列持久化、交換器持久化。無論是持久化消息還是非持久化消息都可以被寫入磁盤。

當RabbitMQ收到消息時,如果是持久化消息,則會儲存在內存中,同時也會寫入磁盤;如果是非持久化消息,則只會存在內存中。當內存使用達到RabbitMQ的臨界值時,內存中的數據會被交換到磁盤,持久化消息由於本就存在於磁盤中,不會被重複寫入。

消息的持久化是在發消息時,通過deliveryMode設置,隊列、交換器也可以通過參數持久化,非持久化的消息、隊列、交換器在rabbitmq-server重啓後會消失,即使已經被寫入磁盤。

內存告警

RabbitMQ中通過內存閾值參數控制內存的使用量,當內存使用超過配置的閾值時,RabbitMQ會阻塞客戶端的連接並停止接收從客戶端發來的消息,以免服務崩潰,同時客戶端於與服務端的心跳檢測也會失效。

內存控制

當出現內存告警時,可以通過管理命令臨時調整。

rabbitmqctl set_vm_memory_high_watermark <fraction>

fraction爲內存閾值,默認是0.4,表示RabbitMQ使用的內存超過系統內存的40%時,會產生內存告警,通過此命令修改的閾值在重啓後會失效。可以通過修改配置文件的方式,使之永久生效,但是需要重啓服務。

# rabbitmq.conf

vm_memory_high_watermark.relative=0.4
#vm_memory_high_watermark.absolute=1GB

RabbitMQ提供relative與absolute兩種配置方式

  • relative:相對值,也就是前面的fraction參數,建議0.4~0.66,不能太大
  • absolute:絕對值,固定大小,單位爲KB、MB、GB
rabbitmqctl set_vm_memory_high_watermark absolute <value>

內存換頁

在RabbitMQ達到內存閾值並阻塞生產者之前,會嘗試將內存中的消息換頁到磁盤,以釋放內存空間。內存換頁由換頁參數控制,默認爲0.5,表示當內存使用量達到內存閾值的50%時會進行換頁,也就是0.4*0.5=0.2。

vm_memory_high_watermark_paging_ratio=0.5

當換頁閾值大於1時,相當於禁用了換頁功能

磁盤控制

RabbitMQ通過磁盤閾值參數控制磁盤的使用量,當磁盤剩餘空間小於磁盤閾值時,RabbitMQ同樣會阻塞生產者,避免磁盤空間耗盡。
磁盤閾值默認50M,由於是定時檢測磁盤空間,不能完全消除因磁盤耗盡而導致崩潰的可能性,比如在兩次檢測之間,磁盤空間從大於50M變爲0M。
一種相對謹慎的做法是將磁盤閾值大小設置與內存相等

rabbitmqctl set_disk_free_limit <limit>
rabbitmqctl set_disk_free_limit mem_relative <fraction>
# limit爲絕對值,KB、MB、GB
# fraction爲相對值,建議1.0~2.0之間

# rabbitmq.conf
disk_free_limit.relative=1.5
# disk_free_limit.absolute=50MB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章