当前位置:   article > 正文

RabbitMQ--扩展--12--内存、硬盘、队列阈值_rabbitmq blocked及blocking

rabbitmq blocked及blocking

RabbitMQ–扩展–12–内存、硬盘、队列阈值


1、内存告警

  1. 当内存占用高于 内存阈值时,就会产生内存告警并阻塞所有生产者的连接,一旦告警被解除(有消息被消费或者从内存转储到磁盘等情况的发生),一切都会恢复正常。
  2. 在出现内存告警后,所有的客户端连接都会被阻塞。阻塞分为 blocking 和 blocked 两种。
    1. blocking:表示没有发送消息的链接。
    2. blocked:表示试图发送消息的链接。
  3. 内存阈值:
    1. 默认:硬件内存的0.4
    2. 范围:0.4-0.7 之间

1.1、设置 内存阈值

如果出现了内存告警,并且机器还有可用内存,可以通过命令调整内存阈值,解除告警。

1.1.1、配置文件写法

# 比值写法
vm_memory_high_watermark.relative = 0.6

# 绝对值写法 
vm_memory_high_watermark.absolute = 1GB
  • 1
  • 2
  • 3
  • 4
  • 5

1.1.2、命令行写法

# 比值写法

rabbitmqctl set_vm_memory_high_watermark 0.6


# 绝对值写法 
rabbitmqctl set_vm_memory_high_watermark absolute 2gb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 4

在这里插入图片描述

1.2.3、刷新管理页面

在这里插入图片描述

  1. 可以看到Memory变成了红色,表示此节点内存告警了
  2. 队列将不接受生产着发出的信息

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"

  • 1
  • 2

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 可以看到 生产者 的链接处于 blocking 状态
  2. 可以看到 消费者 的链接处于 blocked 状态。
  3. 队列的消息数量没有变化。

1.2.5、解除内存告警

docker exec -it rabbitmq /bin/bash

rabbitmqctl set_vm_memory_high_watermark absolute 1G

  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
在这里插入图片描述

2、内存换页

  1. 在Broker节点的使用内存即将达到内存阈值之前,它会尝试将队列中的消息存储到磁盘以释放内存空间,这个动作叫内存换页
  2. 持久化和非持久化的消息都会被转储到磁盘中,其中持久化的消息本身就在磁盘中有一份副本,此时会将持久化的消息从内存中清除掉。
  3. 默认值:0.5
    1. 在内存到达内存阈值的50%时会进行换页动作。也就是说,在默认的内存阈值为 0.4的情况下,当内存超过 0.4x 0.5=0.2 时会进行换页动作。
    2. 建议小于0.7

2.1、设置 内存换页

  1. 通过修改配置文件,调整内存换页分页阈值
  2. 不能通过命令调整

# 此值大于1时,相当于禁用了换页功能。 
vm_memory_high_watermark_paging_ratio = 0.75
  • 1
  • 2
  • 3

3、磁盘告警

  1. 当磁盘剩余空间低于磁盘的阈值时,RabbitMQ 同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃
  2. 默认值:50MB
    1. 表示当磁盘剩余空间低于 50MB 时,会阻塞生产者并停止内存中消息的换页动作
  3. 这个阈值的设置可以减小,但不能完全消除因磁盘耗尽而导致崩渍的可能性。比如在两次磁盘空间检测期间内,磁盘空间从大于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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.1.2、配置文件写法

# 设定磁盘剩余空间低于100G即报警
disk_free_limit.absolute = 100


# 设定磁盘空间低于内存RAM 20倍时报警
配置文件写法 disk_free_limit.relative = 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.2、模拟磁盘告警

3.2.1、当前的磁盘空间

在这里插入图片描述

3.2.2、调整磁盘阈值,大于当前磁盘空间

docker exec -it rabbitmq /bin/bash

rabbitmqctl set_disk_free_limit 100GB

  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

3.2.3、刷新管理页面

在这里插入图片描述

  1. 可以看到Disk space变成了红色,表示此节点磁盘告警了
  2. 后续步骤同模拟内存告警。

4、队列告警

4.1、消息堆积问题

生产者发送消息的速度超过了消费者处理的速度,就会导致队列的消息堆积,直到队列存储消息达到上限。最早接受的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。

4.1.1、解决消息堆积问题

  1. 增加更多的消费者,提高消费者速度
  2. 在消费则内开启线程池加快消息处理速度
  3. 使用惰性队列,扩大队列容积,提高堆积上限
    1.

4.1.2、惰性队列

https://blog.csdn.net/zhou920786312/article/details/127425950
  • 1

4.2、普通的队列阈值(非惰性队列)

  • 默认:40% ,
  • 当队列到了40%时,mqBroker 会阻止生产者发送消息,并将队列中消息持久化到磁盘,等腾出空间了再接收消息。所以mq的性能是一个不稳定,波浪形的。而惰性队列在接收消息后会直接写到磁盘,所以不会触发队列的存储预警,性能具有稳定性,延迟性。 因为惰性队列支持百万的消息存储,所以用它来解决消息堆积问题再好不过了。

5、API监控

5.1、内存与磁盘报警

上述的内存与磁盘报警分别为mem_alarm disk_free_alarm,如果这两个值为true,则需要及时响应。

curl -i -u admin:admin "http://192.168.0.191:15672/api/nodes/rabbit@mq01"
  • 1

可以作为监控数据使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/976528
推荐阅读
相关标签
  

闽ICP备14008679号