RabbitMQ 內存和磁盤警告


內存和磁盤警告

有兩種情況下,Rabbit MQ會停止讀取客戶端的連接socket,為了防止crash崩潰,這兩種情況是:

內存使用達到配置值

磁盤空間下降到配置值下

在這兩種情況下,服務器會臨時阻塞連接—服務器會暫停讀取發布消息的客戶端的連接,連接心跳監控也會被禁用,在rabbitmqctl和管理查建中的所有網絡連接如果是blocking狀態,意味着他們沒有嘗試發送,因此可以繼續,如果是blocked狀態,意味着他們已經發布了,現在需要被暫停。

集群的警告

當運行Rabbit MQ集群的時候,內存和磁盤警告是集群范圍的,如果一個節點達到了限制,所有的節點都會阻塞連接。

這樣的意圖是停止生產者,但是讓消費者繼續不受影響,但是因為協議允許生產者和消費者在同一個Channel或者同一個連接的不同Channel上進行操作,這個邏輯是不完美的,在實踐中,不會產生任何問題,因為節流作為一種延遲被觀察,盡管如此,建議使用單獨的連接分別作為生產和消費。

文件描述符耗盡 Running out of File Descriptors

當服務器使用了操作系統分配給它的所有文件描述符,它會拒絕客戶端連接,參考 “ 網絡指南 ” 學習更多。

當客戶端嘗試發送比服務器接收消息快的時候,它們會進入瞬時的流控。

相關主題

內存如何限制工作

磁盤如何限制工作

客戶端可以檢測它們是否被阻塞

內存警告

Rabbit MQ服務器在啟動和執行 rabbitmqctl set_vm_memory_high_watermark fraction 的時候會檢測機器上的RAM大小,默認情況下,Rabbit MQ使用內存超過40%的時候,會發出內存警告,阻塞所有發布消息的連接,一旦警告解除(etc,服務器paging消息到硬盤或者分發消息到消費者並且確認)服務會恢復正常。

默認的內存閾值是40%,注意,這並不會阻止Rabbit MQ Server使用不到40%,僅僅意味着到達這個點的時候,發布者會被扼殺,最壞的情況下,Erlang虛擬機會引起雙倍的內存使用(RAM的80%),強烈建議開啟操作系統的SWAP和Page Files。

32位架構每個進程的內存限制是2G,一般的64位(AMD或者Interleaving)每個進程允許256T,64位的Windows限制位8T,但是,即使在64位下,32的進程最大可用地址空間也是2G。

配置內存閾值

可以通過編輯配置文件來調整觸發流控的內存閾值,下面是把閾值設置位默認值0.4

vm_memory_high_watermark.relative = 0.4

下面是使用經典配置格式:

[{rabbit, [{vm_memory_high_watermark, 0.4}]}].
默認值0.4表示安裝的RAM或者可用虛擬地址空間兩者較小的40%,如果在一個32位機器上,你安裝了4G內存,4G的40%是1.6G,但是在32位Windows上,每個進程限制2G,所有閾值實際上是2G的40%(820M).

另外,內存閾值可以通過設置一個RAM絕對值來調整,下面的例子把閾值設置位1073741824字節(1024M)

vm_memory_high_watermark.absolute = 1073741824
相同的例子,但是使用內存單位

vm_memory_high_watermark.absolute = 1024MB
使用經典配置格式

[{rabbit, [{vm_memory_high_watermark, {absolute, 1073741824}}]}].
經典格式帶單位

[{rabbit, [{vm_memory_high_watermark, {absolute, "1024MiB"}}]}].
如果這個絕對值比安裝的RAM或者可用虛擬地址空間大,閾值會被設置位較小的。

內存限制在Rabbit MQ Server啟動的時候,會被附加到RABBITMQ_NODEHOME.log日志上。

=INFO REPORT==== 29-Oct-2009::15:43:27 ===
Memory limit set to 2048MB.
在borker運行的時候也可以使用 rabbitmqctl set_vm_memory_high_watermark fraction 命令或者 rabbitmqctl set_vm_memory_high_absolute memory_limit命令,內存單位也可以使用,命令會立即生效,直到broker停止,如果broker重新啟動也要生效的話,相應的配置文件也要改變,在執行此命令但是不改變閾值的情況下,在具有熱交換的RAM系統里面,閾值可能會變化(因為內存總量變了。。)

禁用所有的發布

設置閾值為0,會立即觸發內存警告,阻塞所有的發布連接(如果你希望禁用全局發布,這是非常有用的),使用rabbitmqctl set_vm_memory_high_watermark 0.

有限的地址空間

當在64位機器上運行32位Erlang,地址內存是受限制的,服務器會檢測並打印如下一條消息:

=WARNING REPORT==== 19-Dec-2013::11:27:13 ===
Only 2048MB of 12037MB memory usable due to limited address space.
Crashes due to memory exhaustion are possible - see
http:<em>//www.rabbitmq.com/memory.html#address-space</em>
內存警告不是完美的,盡管停止發布通常會阻止內存的進一步使用,但還是有相當大的可能,其它一些東西會繼續提升內存的使用,通常,這種情況發生的時候,物理內存被耗盡,操作系統會開始交換,但是使用一個受限的地址空間,當超過這個限制的時候,會引起VM的幫虧。

因此強烈建議,在64位OS上運行64位Erlang虛擬機。

配置Paging閾值

在broker達到high watermark阻塞發布者之前,它會嘗試通過將隊列的內容page到磁盤來釋放內存,持久化和瞬時消息都會被page out.

默認情況下,在borker達到閾值的50%時(默認內存閾值是0.4,當0.2的內存被使用時)會發生這種情況。可以通過修改 vm_memory_high_watermark_paging_ration配置來進行修改:

vm_memory_high_watermark_paging_ratio = 0.75
vm_memory_high_watermark.relative = 0.4
使用經典配置:

[{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75},
{vm_memory_high_watermark, 0.4}]}].
上面的配置會在內存使用到04.*0.75=0.3的時候開始paging,在內存使用到0.4的時候阻塞發布者。可以把vm_memory_high_watermark_paging_ratio設置的比1大,在這種情況下,隊列不會把內容page到磁盤,如果引起了內存警告,生產者會跟上面解釋的一樣被阻塞。

不識別的平台

如果Rabbit MQ Server不能識別你的系統,它會在RABBITMQ_NODENAME.log文件中追加一條信息,接着它會假設有1GRAM安裝。

=WARNING REPORT==== 29-Oct-2009::17:23:44 ===
Unknown total memory size for your OS {unix,magic_homegrown_os}. Assuming memory size is 1024MB
在這種情況下,vm_memory_high_watermark配置值會使用1G,在使用默認值0.4的時候,RabbitMQ的內存閾值是410M,因此當內存使用超過410M的時候,它就會扼殺生產者,當Rabbit MQ不識別你的平台的時候,如果你有8GRAM,你希望閾值設置位0.3在內存超過3G的時候來throttle生產者,

磁盤警告

當可用磁盤空間下降到配置值(默認為50M)之下,一個警告會觸發,所有的生產者會被阻塞,目標是避免填充整個磁盤,這會導致節點的寫操作失敗,導致Rabbit MQ中斷,為了減小填充磁盤的風險,所有進來的消息都會阻塞,在內存的壓力下,瞬時的消息,也會被page到磁盤,將繼續占用已經到達臨界值的磁盤空間,如果斯潘警告設置的太低,消息被快速page,有可能在兩次磁盤空間檢查之間填充完整個磁盤,導致Rabbit MQ崩潰(10s),一種更保守的方法是將限制設置為與系統上安裝的內存量相同的限制(參見下面的配置)。

如果磁盤可用空間下降到配置值之下,警告會觸發,broker數據庫使用的磁盤或者分區的可用空間每10S就會檢測一次,用來決定是否觸發或者清楚警告,監控會從服務器一啟動的時候就開始,在log file中會增加一條條目:

=INFO REPORT==== 23-Jun-2012::14:52:41 ===
Disk free limit set to 953MB
在不識別的平台上,監控會禁用,日志中打印消息:

=WARNING REPORT==== 23-Jun-2012::15:45:29 ===
Disabling disk free space monitoring

2019-12-02 14:14:37.008 [info] <0.374.0> Free disk space is insufficient. Free bytes: 49971200. Limit: 50000000
2019-12-02 14:14:37.008 [warning] <0.370.0> disk resource limit alarm set on node rabbit@iZwz9a2gqhk6zw8dbt0ok2Z.

**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
2019-12-02 14:31:07.853 [info] <0.374.0> Free disk space is sufficient. Free bytes: 30019989504. Limit: 50000000
2019-12-02 14:31:07.853 [warning] <0.370.0> disk resource limit alarm cleared on node rabbit@iZwz9a2gqhk6zw8dbt0ok2Z
2019-12-02 14:31:07.854 [warning] <0.370.0> disk resource limit alarm cleared across the cluster
2019-12-02 18:45:57.768 [error] <0.2758.0> Channel error on connection <0.1336.0> (172.18.211.58:35685 -> 172.18.211.59:5672, vhost: '/', user: 'syp'), channel 9:
operation basic.ack caused a channel exception precondition_failed: unknown delivery tag 1
2019-12-05 10:45:18.288 [info] <0.374.0> Free disk space is insufficient. Free bytes: 49905664. Limit: 50000000
2019-12-05 10:45:18.288 [warning] <0.370.0> disk resource limit alarm set on node rabbit@iZwz9a2gqhk6zw8dbt0ok2Z.

**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************
2019-12-05 10:51:18.581 [info] <0.374.0> Free disk space is sufficient. Free bytes: 15076024320. Limit: 50000000
2019-12-05 10:51:18.581 [warning] <0.370.0> disk resource limit alarm cleared on node rabbit@iZwz9a2gqhk6zw8dbt0ok2Z
2019-12-05 10:51:18.582 [warning] <0.370.0> disk resource limit alarm cleared across the cluster

 

當在集群中運行Rabbit MQ的時候,磁盤警告也是集群范圍的,如果一個節點達到限制值之下,所有的節點都會阻塞進來的消息。

Rabbit MQ會定時檢查可用磁盤空間大小,這個頻率跟上次檢查時可用空間大小相關(以確保在磁盤將要耗盡時,磁盤警告能及時觸發),一般是每10S檢查一下磁盤空間,但是當接近限制值時,頻率會提升,當非常接近的時候檢測會1秒10此,它可能會影響系統的負載。

當可用磁盤空間下降到配置值之下,Rabbit MQ會阻塞生產者,阻止內存中的消息page到磁盤,這會減少磁盤被耗盡而導致崩潰的風險,但是不能完全杜絕。特別是消息被快速page到磁盤,有可能在兩次磁盤檢查之間用完整個可用空間,保守的做法如下:

配置磁盤可用空間值

磁盤可用空間limit是通過disk_free_limit設置的,默認的50M是為了數據庫分區可用,配置文件設置可用空間為1GB。

disk_free_limit.absolute = 1000000000
加上單位(KB,MB,GB)

disk_free_limit.absolute = 1GB
使用經典的格式

[{rabbit, [{disk_free_limit, 1000000000}]}].
帶單位

也可以設置磁盤可用空間跟機器上的內存相關,這個配置設置磁盤可用跟內存大小一樣

disk_free_limit.relative = 1.0
經典配置

[{rabbit, [{disk_free_limit, {mem_relative, 1.0}}]}].
這個配置可以在broker運行的時候通過命令rabbitmqctl set_disk_free_limit 大小

或者rabbitmq_disk_free_limit mem_relative 值來使用,這個命令會立即生效,直到broker停止,如果重啟也要生效的話,需要修改配置文件。

流控

RabbitMQ會降低連接的速度,當發送太快隊列跟不上的時候,不需要進行配置。

一個流控的連接在rabbitmqctl和管理插件中會顯示flow狀態,這意味着這個連接每一秒會被阻塞,接觸阻塞好幾次,使消息的接收速率能匹配上服務器處理的速率。

一般來說,受流控的連接跟正常運行的是沒什么不同的,流控狀態來通知sysadmin,發送速率應該受限,但是從客戶端的角度,它看起來只是服務器的帶寬比實際低而已。

 

參考:

https://blog.csdn.net/qq_33814088/article/details/83543051

https://www.jianshu.com/p/9d8514a23a34

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM