RabbitMQ–扩展–12–内存,硬盘阈值
1、内存告警
- 当内存占用高于 内存阈值时,就会产生内存告警并阻塞所有生产者的连接,一旦告警被解除(有消息被消费或者从内存转储到磁盘等情况的发生),一切都会恢复正常。
- 在出现内存告警后,所有的客户端连接都会被阻塞。阻塞分为 blocking 和 blocked 两种。
- blocking:表示没有发送消息的链接。
- blocked:表示试图发送消息的链接。
- 内存阈值:
- 默认:硬件内存的0.4
- 范围:0.4-0.7 之间
1.1、设置 内存阈值
如果出现了内存告警,并且机器还有可用内存,可以通过命令调整内存阈值,解除告警。
1.1.1、配置文件写法
# 比值写法
vm_memory_high_watermark.relative = 0.6
# 绝对值写法
vm_memory_high_watermark.absolute = 1GB
1.1.2、命令行写法
# 比值写法
rabbitmqctl set_vm_memory_high_watermark 0.6
# 绝对值写法
rabbitmqctl set_vm_memory_high_watermark absolute 2gb
1.2、模拟内存告警
1.2.1、当前的使用内存
1.2.2、调整内存阈值,小于当前的使用内存
docker exec -it rabbitmq /bin/bash
rabbitmqctl set_vm_memory_high_watermark absolute 50MB
1.2.3、刷新管理页面
- 可以看到Memory变成了红色,表示此节点内存告警了
- 队列将不接受生产着发出的信息
1.2.4、压测
runjava com.rabbitmq.perf.PerfTest -x 1 -y 1 -h "amqp://admin:123456@192.168.187.171:5672" -u "memory-test-v1" -a --id "test1"
- 可以看到 生产者 的链接处于 blocking 状态
- 可以看到 消费者 的链接处于 blocked 状态。
- 队列的消息数量没有变化。
1.2.5、解除内存告警
docker exec -it rabbitmq /bin/bash
rabbitmqctl set_vm_memory_high_watermark absolute 1G
2、内存换页
- 在Broker节点的使用内存即将达到内存阈值之前,它会尝试将队列中的消息存储到磁盘以释放内存空间,这个动作叫内存换页
- 持久化和非持久化的消息都会被转储到磁盘中,其中持久化的消息本身就在磁盘中有一份副本,此时会将持久化的消息从内存中清除掉。
- 默认值:0.5
- 在内存到达内存阈值的50%时会进行换页动作。也就是说,在默认的内存阈值为 0.4的情况下,当内存超过 0.4x 0.5=0.2 时会进行换页动作。
- 建议小于0.7
2.1、设置 内存换页
- 通过修改配置文件,调整内存换页分页阈值
- 不能通过命令调整
# 此值大于1时,相当于禁用了换页功能。
vm_memory_high_watermark_paging_ratio = 0.75
3、磁盘告警
- 当磁盘剩余空间低于磁盘的阈值时,RabbitMQ 同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃
- 默认值:50MB
- 表示当磁盘剩余空间低于 50MB 时,会阻塞生产者并停止内存中消息的换页动作
- 这个阈值的设置可以减小,但不能完全消除因磁盘耗尽而导致崩渍的可能性。比如在两次磁盘空间检测期间内,磁盘空间从大于50MB被耗尽到0MB
3.1、设置 磁盘阈值
如果出现了内存告警,并且机器还有可用内存,可以通过命令调整内存阈值,解除告警。
3.1.1、命令行写法
# disk_limit 为固定大小,单位为MB、GB
# rabbitmqctl set_disk_free_limit <disk_limit>
# 设定磁盘剩余空间低于100G即报警
rabbitmqctl set_disk_free_limit 100G
# fraction 为相对比值,建议的取值为1.0~2.0之间
rabbitmqctl set_disk_free_limit mem_relative <fraction>
3.1.2、配置文件写法
# 设定磁盘剩余空间低于100G即报警
disk_free_limit.absolute = 100
# 设定磁盘空间低于内存RAM 20倍时报警
配置文件写法 disk_free_limit.relative = 20
3.2、模拟磁盘告警
3.2.1、当前的磁盘空间
3.2.2、调整磁盘阈值,大于当前磁盘空间
docker exec -it rabbitmq /bin/bash
rabbitmqctl set_disk_free_limit 100GB
3.2.3、刷新管理页面
- 可以看到Disk space变成了红色,表示此节点磁盘告警了
- 后续步骤同模拟内存告警。
4、API监控
使用API可以查看mq状态
上述的内存与磁盘报警分别为mem_alarm disk_free_alarm,如果这两个值为true,则需要及时响应。
curl -i -u admin:admin "http://192.168.0.191:15672/api/nodes/rabbit@mq01"
可以作为监控数据使用。