20120825 鄭昀
[{rabbit, [{vm_memory_high_watermark, 0.4}]}].
當 MQ 啟動時,該內存閾值也會寫入到 RABBITMQ_NODENAME.log 文件里,如下所示:
Memory limit set to 2048MB.
=WARNING REPORT==== 29-Oct-2009::17:23:44 ===
Unknown total memory size for your OS {unix,magic_homebrew_os}. Assuming memory size is 1024MB.
二,Apache ActiveMQ 的流量控制
- 不管 mq 有無做持久化配置:
- !ActiveMQ所使用的內存到達 memoryUsage 配置值,默認值64MB;
- 如果 mq 做了持久化配置:
- !要打開了useCache開關,表明要將持久化消息緩存起來以便快速訪問,默認是True;
- !緩存在內存中消息總字節數到達 memoryLimit 配置值,默認值是1MB。
一,基於信用證(Credit)的擁塞控制機制
1993年,ATM領域開始尋找一種可以動態分配帶寬並防止信元丟失的傳輸機制。因此提出了ABR(Available Bit Rate,可用比特率)業務,ABR 不強制網絡為其分配固定的帶寬,網絡通過反饋信息動態調整分配給每個 ABR 連接的帶寬。很多專家都投入到 ABR 業務的擁塞控制規范研究上。
基於 Credit 的方案由哈佛大學的H.T.Kung教授首先提出,采用鏈路級流控機制,以單一鏈路或虛電路VC作為基本的控制單位。每條鏈路有一個信元發送節點(可以是一個源端或一個交換節點)和一個接收節點(可以是一個交換節點或一個目的端系統),每個節點為每一條VC維持一個排隊隊列,信元接收端監視每條VC的排隊隊列長度,決定發送端可以發到VC上的信元數量(用信用證通知),信元發送端只能發送信用證值所允許的最大信元數量,如果只有一條VC,則信用證的值應足夠大,以充分利用鏈路的帶寬。一般來說,信用證值應滿足下列條件:信用證值大於等於 鏈路信元速率乘以鏈路來回程傳輸時延。
圖6-17 給出了基於信用證擁塞控制機制的基本工作原理。信元接收方首先發送信用證到信元發送方,通知可用的緩沖區容量,發送方收到信用證之后,就可決定發送的信元數量。
它的最大缺點是實現復雜,在每一對相鄰的節點之間都需要維持這一信用證機制,同時也增加了信元的時延。
二,RabbitMQ 是如何實現的
『實質上 RabbitMQ 就是通過監控每個進程的mailbox,當某個進程負載過高來不及接收消息時,這個進程的mailbox就開始堆積消息。
當堆積到一定量時,就會阻塞住上游進程,讓其不得接收新消息。從而慢慢上游進程的mailbox也開始積壓消息。
到了一定的量又會阻塞上游的上游的進程接收消息,最后就會使得負責網絡數據包接收的進程阻塞掉,暫停接收數據。
這就有點像一個多級水庫,當下游水庫壓力過大時,上游水庫就得關閉閘門,使得自己的壓力也越來越大,需要關閉更上游的水庫閘門,直到關閉最最上游的閘門。』——http://ybbct.iteye.com/blog/