RabbitMQ通过vm_memory_high_watermark参数限制内存使用比例(默认40%,即0.4)。当内存使用超过该阈值时,会触发流控机制(阻塞生产者连接),防止内存溢出。
/etc/rabbitmq/rabbitmq.conf(若不存在则创建),添加或修改以下内容:vm_memory_high_watermark.relative = 0.6 # 设置为系统总内存的60%(可根据服务器内存调整,建议不超过70%)
或通过命令行动态设置(立即生效,重启后失效):rabbitmqctl set_vm_memory_high_watermark 0.6
当内存使用达到水位线时,RabbitMQ会将非持久化消息换页到磁盘(持久化消息仍保留在内存),释放内存空间。需调整vm_memory_high_watermark_paging_ratio参数(默认0.5,即水位线的50%)。
rabbitmq.conf中添加:vm_memory_high_watermark_paging_ratio = 0.6 # 当内存使用达到水位线的60%时开始换页(如水位线0.6,则内存用至36%时换页)
长期未消费的队列或过期消息会持续占用内存,需定期清理:
rabbitmqctl list_queues name messages_ready messages_unacknowledged
rabbitmqctl delete_queue <queue_name>
x-message-ttl参数(单位:毫秒),例如:channel.queue_declare(queue='my_queue', arguments={'x-message-ttl': 3600000}) # 消息1小时后自动删除
x-max-length参数限制队列长度,超过则丢弃或拒绝消息:channel.queue_declare(queue='my_queue', arguments={'x-max-length': 10000}) # 最多保留1万条消息
消费者处理速度慢是内存堆积的根本原因之一,需提升消费并发度:
channel.basic_qos(prefetch_count=100) # 每个消费者每次最多获取100条消息
ExecutorService,Golang中使用Goroutine)。旧版本可能存在内存泄漏或优化不足的问题,建议升级到最新稳定版(如3.12.x及以上)。升级前需备份数据并参考官方文档:RabbitMQ升级指南。
通过监控工具实时跟踪内存使用情况,及时发现异常:
rabbitmq-plugins enable rabbitmq_management),通过Web界面(http://服务器IP:15672)查看内存使用、队列长度等指标。memory_used、mem_alarm等指标,设置阈值告警(如内存使用超过70%时报警)。当磁盘空闲空间不足时,RabbitMQ会阻塞生产者,加剧内存压力。需设置disk_free_limit参数(默认50MB),例如:
disk_free_limit.relative = 1.0 # 当磁盘剩余空间低于总空间的10%时报警(建议设置为10%以上)
或通过命令行设置:
rabbitmqctl set_disk_free_limit 1GB # 至少保留1GB磁盘空间
以上方法需结合实际情况组合使用(如先调整水位线,再优化消费者,最后清理无用数据),从根源上解决内存溢出问题。