RabbitMQ 內存控制 硬盤控制


RabbitMQ服務器在啟動時以及abbitmqctl set_vm_memory_high_watermark fraction 執行時,會檢查計算機的RAM總大小. 默認情況下下, 當 RabbitMQ server 的使用量超過RAM的40% ,它就會發出內存警報,並阻塞所有連接. 一旦內存警報清除 (如,服務器將消息轉存於磁盤,或者將消息投遞給clients),服務又地恢復.
默認內存閥值設置為已安裝RAM的40%. 注意這並不會阻止RabbitMQ server使用內存量超過40%, 它只是為了壓制發布者. Erlang的垃圾回收器最壞情況下,可使用配置內存的2倍(默認情況下t, RAMr的80%). 因此強制建議開啟OS swap或page files .
32位架構傾向於每一個進程有2GB的內存限制. 64位架構的一般實現(i.e. AMD64 和 Intel EM64T) 只允許每個進程為256TB. 64-位 Windows 限制為8TB. 但是,請注意,即使是64位操作系統下,一個32位的過程往往只有一個2GB的最大地址空間。
 
配置內存閥值
內存閥值可通過編輯 configuration file來配置.下面的例子將閥值設為默認值0.4:
[{rabbit, [{vm_memory_high_watermark, 0.4}]}].
默認值0.4 代表的是已安裝RAM的 40% , 有時候還更小.如:在 32位平台中,如果你安裝有4GB RAM , 4GB 的40% 是 1.6GB, 但是 32-位 Windows 正常情況下限制進程為2GB,因此實際閥值是2GB的40% (即820MB).
另外, 內存閥值也可以設置為絕對值. 下面的例子將閥值設為了1073741824 字節 (1024 MB):
[{rabbit, [{vm_memory_high_watermark, {absolute, 1073741824}}]}].
同例, 也可使用內存單位:
[{rabbit, [{vm_memory_high_watermark, {absolute, "1024MiB"}}]}].
如果絕對上限大於了安裝的RAM可用的虛擬地址空間, 閥值上限會略小.
當RabbitMQ服務器啟動時,內存限制將追加到RABBITMQ_NODENAME.log 文件中:
=INFO REPORT==== 29-Oct-2009::15:43:27 === Memory limit set to 2048MB.
 
內存限制也可以使用rabbitmqctl status命令查詢.
其閥值也可以在broker運行時,通過rabbitmqctl set_vm_memory_high_watermark fraction 命令或 rabbitmqctl set_vm_memory_high_watermark absolute memory_limit 命令修改. 內存單位也可以在命令中使用. 此命令會在broker重啟后生效. 當執行此命令時,內存限制可能會改變熱插拔RAM,而不會發生報警,這是因為需要全部數量的系統RAM.
 
禁止所有發布
其值為0時,會立即觸發報警並禁用所有發布 (當需要禁用全局發布時,這可能是有用的); use rabbitmqctl set_vm_memory_high_watermark 0.
 
限制的地址空間
當在64位操作系統中運行32位 Erlang VM時,(or a 32 bit OS with PAE), 可用地址內存是受限制的. 服務器探測到后會記錄像下邊的日志消息:
=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://www.rabbitmq.com/memory.html#address-space
 
內存報警系統是不完美的.雖然停止發布通常會防止任何進一步的內存使用,但可能有其他東西繼續增加內存使用。通常情況下,當這種情況發生時,物理內存耗盡,操作系統將開始交換。但是當運行一個有限的地址空間,超過限制的運行會導致虛擬機崩潰。
 
因此強制建議在在64位操作系統上運行64位的Erlang VM.
 
配置分頁閾值
在broker達到最高水位阻塞發布者之前,它會嘗試將隊列內容分頁輸出到磁盤上來釋放內存. 持久化和瞬時消息都會分頁輸出 (已經在磁盤上的持久化消息會被趕出內存).
默認情況下,在達最高水位的50%時,就會發生這種情況. (即,默認最高水位為0.4, 這會在內存使用達到20%時就會發生). 要修改此值,可修改vm_memory_high_watermark_paging_ratio 配置的0.5默認值. 例如:
[{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75}, {vm_memory_high_watermark, 0.4}]}].
上面的配置表示在內存使用達到30%時,就會啟動,40%的時候會阻塞發布者.
 
也可以將vm_memory_high_watermark_paging_ratio 值設為大於1.0的值.在這種情況下,隊列不會把它的內容分頁到磁盤上.如果這引起了內存報警關閉,那么生產者會如上面預期的一樣被阻塞.
 
未確認的平台
如果RabbitMQ服務器不能識別你的系統,它將在RABBITMQ_NODENAME.log 文件中追加警告.
然后它會假設安裝了超過了1GB的RAM:
=WARNING REPORT==== 29-Oct-2009::17:23:44 === Unknown total memory size for your OS {unix,magic_homebrew_os}. Assuming memory size is 1024MB.
在這種情況下,vm_memory_high_watermark 配置值假設為1GB RAM. 在 vm_memory_high_watermark 默認設為 0.4的情況下, RabbitMQ的內存閥值設為了410MB, 因此當RabbitMQ使用了多於410M內存時,它會阻塞生產者.因此當RabbitMQ不能識別你的平台時,如果你實際有8GB RAM,並且你想讓RabbitMQ內存使用量超過3GB阻塞生產者,你可以設置vm_memory_high_watermark為3.
推薦RAM 水位設置,可參考 Production Checklist.

 

 

 

一、內存控制:

vm_memory_high_watermark 該值為內存閾值,默認為0.4。意思為物理內存的40%。40%的內存並不是內存的最大的限制,它是一個發布的節制,當達到40%時Erlang會做GC。最壞的情況是使用內存80%。如果把該值配置為0,將關閉所有的publishing 。

rabbitmqctl set_vm_memory_high_watermark 0

 

Paging 內存閾值,該值為默認為0.5,該值為vm_memory_high_watermark的20%時,將把內存數據寫到磁盤。

如機器內存16G,當RABBITMQ占用內存1.28G(16*0.4*0.2)時把內存數據放到磁盤。

 

二、硬盤控制:

當RabbitMQ的磁盤空閑空間小於50M(默認),生產者將被BLOCK,

如果采用集群模式,磁盤節點空閑空間小於50M將導致其他節點的生產者都被block

可以通過disk_free_limit來對進行配置。

 

 

 

------------------------------------------------------------------\

可以修改rabbitmq-env.conf配置文件:

[{rabbit,[{vm_memory_high_watermark,0.6}]}].

或者設置成固定值:

[{rabbit,[{vm_memory_high_watermark,{absolute,1073741824}}]}].也就是1024MB.

如果要在broker運行過程中修改,則rabbitmqctl set_vm_memory_high_watermark 0.6

 

 

-------------------------------------------------\

三. 配置
/usr/local/rabbitmq/sbin目錄下
rabbitmq-env 環境配置
rabbitmq-defaults 默認參數設置
rabbitmqctl 管理工具
rabbitmq-plugins 插件管理工具
rabbitmq-server rabbitmq服務

# vim rabbitmq-defaults

主要配置文件
1. enabled_plugins:設置允許的插件列表,格式如下:

2. rabbitmq.config:設置rabbitmq運行參數。結構為hash數組格式。如

其中幾個關鍵參數為:
tcp_listerners 設置rabbimq的監聽端口,默認為[5672]。
disk_free_limit 磁盤低水位線,若磁盤容量低於指定值則停止接收數據,默認值為{mem_relative, 1.0},即與內存相關聯1:1,也可定制為多少byte.
vm_memory_high_watermark,設置內存低水位線,若低於該水位線,則開啟流控機制,默認值是0.4,即內存總量的40%。
hipe_compile 將部分rabbimq代碼用High Performance Erlang compiler編譯,可提升性能,該參數是實驗性,若出現erlang vm segfaults,應關掉。
force_fine_statistics, 該參數屬於rabbimq_management,若為true則進行精細化的統計,但會影響性能。
/usr/local/etc/rabbitmq/rabbitmq.config
[{auth_backends,[rabbit_auth_backend_internal]},
{auth_mechanisms,['PLAIN','AMQPLAIN']},
{backing_queue_module,rabbit_variable_queue},
{cluster_nodes,[]},
{collect_statistics,fine},
{collect_statistics_interval,5000},
{default_permissions,[<<".*">>,<<".*">>,<<".*">>]},
{default_user,<<"guest">>},
{default_user_tags,[administrator]},
{default_vhost,<<"/">>},
{delegate_count,16},
{error_logger,{file,"/usr/local/var/log/rabbitmq/rabbit@Technophiliac.log"}},
{frame_max,131072},
{hipe_compile,false},
{included_applications,[]},
{msg_store_file_size_limit,16777216},
{msg_store_index_module,rabbit_msg_store_ets_index},
{queue_index_max_journal_entries,262144},
{sasl_error_logger,{file,"/usr/local/var/log/rabbitmq/rabbit@Technophiliac-sasl.log"}},
{server_properties,[]},
{ssl_listeners,[]},
{ssl_options,[]},
{tcp_listen_options,
[binary,
{packet,raw},
{reuseaddr,true},
{backlog,128},
{nodelay,true},
{exit_on_close,false}]},
{tcp_listeners,[5672]},
{trace_vhosts,[<<"/">>]},
{vm_memory_high_watermark,0.4}]
3. rabbitmq-env.conf rabbitmq環境參數配置

更詳細的配置參見: http://www.rabbitmq.com/configure.html#configuration-file

4. 啟動

四. rabbitmq插件管理
啟用rabbitmq web管理插件

列出所有插件

 
 
 
好文要頂  關注我  收藏該文 


免責聲明!

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



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