RabbitMQ中的内存与流量控制
Contents
相关内存参数
vm_memory_high_watermark
这个是与流量控制相关的内存参数.
RabbitMQ会在启动和执行命令
rabbitmqctl set_vm_memory_high_watermark 百分比
的时候检测系统所安装的内存总量。默认情况沔,当RabbitMQ服务器使用超过40%
的内存时,它会引起一个内存报警并且阻塞所有连接
。一旦内存报警清除后(例如,由于RabbitMQ服务器将消息页交换到磁盘或者分发到客户端时)就会恢复正常服务了。
所以,将这个值设置为0
,然后它就会立即触发内存报警!如果你希望允许RabbitMQ使用更加多的内存,它可以增大该值.
另一个重要的事项:
默认的内存阀值是 40% 的系统安装的内存。请注意,该值并不是防止RabbitMQ服务器使用超过40%的内存,它仅仅只是指明生产者(publishers)会进行节流(流量控制)
所以,如果你在引起内存报警的时候尝试发送消息,在进行发送期间就会被阻塞了。
如果你想阻塞所有的发送者,你可以将该参数 vm_memory_high_watermark
设置为0.
如果你想禁止
基于内存的流量控制,你可以将该参数vm_memory_high_watermark
设置为100。
vm_memory_limit
这个值,默认就是 vm_memory_high_watermark * installed memory
(如果设置的是百分比参数的话)
可使用内存上限。注意,如果 vm_memory_high_watermark
生效的话,那MQ是有可能超过这个值的(上下波动)
如果 vm_memory_high_watermark
设置的是绝对值的话,那vm_memory_limit = vm_memory_high_watermark
。
流量控制
当达到内存阀值的时候(无论设置的是百分比,还是绝对值),RabbitMQ就会触发流量控制。即publishers
会全部阻塞,直到解除报警才会恢复正常的publishers
服务。
注意
因为RabbitMQ提供两种协议HTTP
和AMQP
。这个流量控制,只是对AMQP
生效的。对HTPP
协议发送的消息并不会进行流量控制。所以,rabbitmq
使用的总内存会超过vm_memory_limit
也就不奇怪了。
例子
测试环境:
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:21:31]
└─[0] <> free -m
total used free shared buffers cached
Mem: 15920 13144 2775 1038 608 5794
-/+ buffers/cache: 6741 9178
Swap: 0 0 0
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:22:16]
└─[0] <> uname -a
Linux sky-linux 3.19.0-32-generic #37~14.04.1-Ubuntu SMP Thu Oct 22 09:41:40 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:22:34]
└─[0] <>
默认情况下的内存
./sbin/rabbitmqctl status
{vm_memory_high_watermark,0.4},
{vm_memory_limit,6677449932},
15920 * 0.4 = 6368.0 MB
6677449932 / 1024 / 1024 = 6368 MB
修改 vm_memory_high_watermark
修改为 0.8
看看效果:
─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:22:34]
└─[0] <> ./sbin/rabbitmqctl set_vm_memory_high_watermark 0.8
Setting memory threshold on 'rabbit@sky-linux' to 0.8 ...
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:25:30]
└─[0] <> ./sbin/rabbitmqctl status
...
{vm_memory_high_watermark,0.8},
{vm_memory_limit,13354899865},
...
15920 * 0.8 = 12736 MB
13354899865 / 1024 / 1024 = 12736 MB
可知,vm_memory_high_watermark
修改后,vm_memory_limit
也会随之改变.
修改 vm_memory_high_watermark 为绝对值
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:38:10]
└─[64] <> ./sbin/rabbitmqctl set_vm_memory_high_watermark absolute 10MB
Setting memory threshold on 'rabbit@sky-linux' to 10000000 bytes ...
┌─[sky@sky-linux] - [/ihome/rabbitmq/rabbitmq_server-3.6.1] - [2016-12-01 03:38:38]
└─[0] <> ./sbin/rabbitmqctl status
...
{vm_memory_high_watermark,{absolute,10000000}},
{vm_memory_limit,10000000},
...
可以看到,它们的值是相等的.