RabbitMQ 内存控制 硬盘控制

本文详细解析了RabbitMQ中内存控制参数vm_memory_high_watermark和Paging内存阈值的作用,以及如何通过disk_free_limit配置硬盘空间限制,确保系统稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内存控制:

vm_memory_high_watermark 该值为内存阈值,默认为0.4。意思为物理内存的40%。40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC。最坏的情况是使用内存80%。如果把该值配置为0,将关闭所有的publishing 。

rabbitmqctl set_vm_memory_high_watermark 0

 

Paging 内存阈值,该值为默认为0.5,该值为vm_memory_high_watermark的20%时,将把内存数据写到磁盘。

如机器内存16G,当RABBITMQ占用内存1.28G(16*0.4*0.2)时把内存数据放到磁盘。

 

二、硬盘控制:

当RabbitMQ的磁盘空闲空间小于50M(默认),生产者将被BLOCK,

如果采用集群模式,磁盘节点空闲空间小于50M将导致其他节点的生产者都被block

可以通过disk_free_limit来对进行配置。

### RabbitMQ 队列缓冲机制 RabbitMQ 中的队列具有复杂的内部结构来管理消息流,确保即使在高负载下也能有效运作。当生产者向队列发送消息时,这些消息会被暂存在内存中;随着数量增加,部分数据可能会溢出到磁盘上以防止服务器资源耗尽。 #### 内存与磁盘之间的平衡 为了优化性能并保护系统稳定,RabbitMQ 实现了一个基于内存使用的自动调节算法。一旦检测到可用内存量低于预设阈值,将会触发一系列操作: - **减少内存占用**:将较旧的消息从内存迁移到磁盘文件。 - **暂停接收新消息**:暂时停止接受来自生产者的新增消息直到当前压力有所缓解[^1]。 这种设计允许 RabbitMQ 在面对突发流量高峰时仍能保持正常运行而不至于崩溃或丢弃重要信息。 #### 持久化设置的影响 对于配置为持久化的队列而言,在发生意外断电或其他异常情况之前已确认收到的消息会被安全保存至硬盘中。这意味着即便 RabbitMQ 重启之后也能够恢复未处理完毕的任务列表继续执行下去[^2]。 ```python import pika connection = pika.BlockingConnection( pika.ConnectionParameters(host='localhost')) channel = connection.channel() # 声明一个持久化的队列 channel.queue_declare(queue='task_queue', durable=True) def callback(ch, method, properties, body): print(f"Received {body}") ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(queue='task_queue', on_message_callback=callback, auto_ack=False) print('Waiting for messages.') channel.start_consuming() ``` 此代码片段展示了如何声明一个持久化的队列 `task_queue` 并消费其中的消息。注意这里设置了 `durable=True` 参数使得队列本身成为持久性的,并且关闭了自动应答模式 (`auto_ack=False`) 来手动控制每条消息的成功确认过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值