1、RabbitMQ 内存警告
当内存使用超过配置的阈值或者磁盘空间剩余空间低于配置的阈值时,RabbitMQ会暂时阻塞客户端的连接,并且停止接收从客户端发来的消息,以此避免服务器的奔溃,客户端与服务端的心跳检测机制也会失效。
如图,如果出现 blocking
或blocked
说明达到了阈值以及高负荷运行了
2、RabbitMQ 的内存控制
参考帮助文档:www.rabbitmq.com/configure.html
出现警告时候,可以通过配置去修改和调整
2-1、命令方式
$ rabbitmqctl set_vm_memory_high_watermark <fraction>
$ rabbitmqctl set_vmmemory_high_watermark absolute 4.8GB
# 或者
$ rabbitmqctl set_vmmemory_high_watermark 0.6
fraction/value 为内存阈值。默认情况是:0.4/2GB,代表的含义是:当RabbitMQ的内存超过40%时,就会产生警告,并且阻塞所有生产者的连接。通过此命令修改阈值在Broker重启以后会失效,通过修改配置文件方式设置的阈值则不会随着重启而消失,但修改配置文件一样要重启
2-2、配置文件方式 rabbitmq.conf
当前配置文件位置:/usr/local/etc/rabbitmq/rabbitmq-env.conf
# 默认
# vm_memory_high_watermark.ralative = 0.4
# 使用 ralative 相对值进行设置fraction,建议取值在0.4~0.7之间,不建议超过0.7
vm_memory_high_watermark.ralative = 0.6
# 使用absolute的绝对值的方式,但是是KB,MB,GB对应的命令如下
vm_memory_high_watermark.absolute = 4.8G
3、 RabbitMQ 的内存换页
在某个 Broker 节点及内存阻塞生产者之前,它会尝试将队列中的消息换页到磁盘以释放内存空间,持久化和非持久化的消息都会写入磁盘,其中持久化的消息本身就在磁盘中有一个副本,所以在转移的过程中持久化的消息会先从内存汇总清除掉。
默认情况下,内存大道的阈值是50%时就会换页处理
也就是说,在默认情况下该内存的阈值是0.4的情况下,当内存超过0.2时,就会进行换页动作。
比如有1000MB 内存,当内存的使用率达到了400MB 的极限,但是因为配置的换页内存0.5,这个时候会在到极限400MB 之前,会把内存中的200MB 进行转移到磁盘中。从而达到文件运行
可以通过vm_memory_high_watermark_paging_ratio
来进行调整
vm_memory_high_watermark.ralative = 0.4
vm_memory_high_watermark_paging_ratio = 0.7(设置值小于1)
为什么设置值小于1,因为如果设置1阈值,内存都已经达到了极限,再去换页的意义就不是很大了。
4、RabbitMQ 的磁盘警告
当磁盘的剩余空间低于确定的阈值时,RabbitMQ同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务奔溃
默认情况下:磁盘预警值为 50MB 的时候会进行预警,表示当磁盘空间小于 50MB 的时候会阻塞生产者并停止内存消息换页到磁盘的过程。
这个阈值可以减小,但是不能完全的消除因磁盘耗尽而导致的奔溃的可能性。比如在两个磁盘空间的检查空隙内,第一次检查是60MB,第二次检查可能就是1MB,就会出现警告。
通过如下命令方式修改
$ rabbitmqctl set_disk_free_limit <disk_limit>
$ rabbitmqctl set_disk_free_limit memory_limit <fraction>
disk_limit:固定单位 KB MB GB
fraction:是相对阈值,建议范围在 1.0~2.0之间。(相对于内存)
通过配置文件配置如下
disk_free_limit.relative = 3.0
disk_free_limit.absolute = 50MB