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