1. 排查内存占用高的根本原因
使用rabbitmqctl status命令查看RabbitMQ整体内存使用情况(重点关注memory字段当前使用量、memory_limit内存阈值及memory_alarm是否触发报警);通过rabbitmqctl list_queues name messages_ready messages_unacknowledged memory命令找出内存占用最高的队列(特别注意messages_unacknowledged(未确认消息)数量异常多的队列);使用rabbitmqctl list_connections和rabbitmqctl list_channels命令检查是否存在大量未释放的客户端连接或通道泄漏;检查是否启用了非官方插件或使用了已知存在内存泄漏的旧版本(建议升级至RabbitMQ 3.12+稳定版本)。
2. 调整内存水位线配置
修改RabbitMQ配置文件(/etc/rabbitmq/rabbitmq.conf),通过vm_memory_high_watermark参数控制内存使用阈值:
0.6-0.7(即系统内存的60%-70%),当内存使用达到该值时,RabbitMQ会启动流控机制,阻止新消息发布,避免内存溢出;vm_memory_high_watermark.absolute = 2GB(根据实际内存调整)。vm_memory_high_watermark_paging_ratio(默认0.5),当内存使用达到水位线的50%时,开始将内存中的消息分页到磁盘,进一步释放内存。3. 优化队列内存使用
x-queue-mode=lazy参数),消息会直接写入磁盘而非内存,显著减少内存占用(适用于日志、归档等低优先级消息队列);x-message-ttl参数(如x-message-ttl=3600000,单位毫秒),让过期消息自动删除,避免长期堆积;x-max-length参数限制队列的最大消息数量(如x-max-length=10000),超过阈值的消息会被丢弃或进入死信队列(DLX)。4. 控制消息与连接资源
prefetch count参数(如prefetch_count=100),限制每个消费者未确认(unack)消息的数量,避免消费者积压过多消息导致内存占用;connection_timeout=30000),关闭闲置连接;使用连接池复用连接,减少频繁创建和销毁连接的开销。5. 启用内存与磁盘交换机制
通过vm_memory_high_watermark和vm_memory_high_watermark_paging_ratio参数激活RabbitMQ的内存换页功能,当内存使用达到阈值时,将内存中的消息逐步转移到磁盘(需确保磁盘有足够空间,建议disk_free_limit.mem_relative设置为2.0以上,即磁盘空间为内存的2倍),避免内存溢出。
6. 监控与告警
rabbitmq-plugins enable rabbitmq_management),通过Web界面(http://服务器IP:15672)实时查看内存使用、队列状态、连接数等指标;7. 硬件与环境优化
/var/lib/rabbitmq)放在SSD上,提升磁盘IO性能,减少因磁盘写入慢导致的内存积压;