相关内存参数

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。

rabbitmq memory

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提供两种协议HTTPAMQP。这个流量控制,只是对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},

...

可以看到,它们的值是相等的.