1. 调整内存使用阈值(vm_memory_high_watermark)
RabbitMQ通过vm_memory_high_watermark参数限制内存使用,防止内存耗尽。该参数有两种配置方式:
total_memory_available_override_value参数配合使用(指定容器可用总内存)。rabbitmqctl set_vm_memory_high_watermark 0.6(相对值)或rabbitmqctl set_vm_memory_high_watermark absolute 2GB(绝对值);/etc/rabbitmq/rabbitmq.conf文件,添加vm_memory_high_watermark.relative = 0.6或vm_memory_high_watermark.absolute = 2GB。2. 优化内存换页策略(vm_memory_high_watermark_paging_ratio)
当内存使用达到vm_memory_high_watermark的vm_memory_high_watermark_paging_ratio比例时,RabbitMQ会将内存中的消息换页到磁盘(持久化消息先清除内存再写入磁盘),以释放内存。默认值为0.5(即高水位线的50%),若设置过高会导致内存耗尽才换页,增加I/O压力;若设置过低则会过早换页,影响性能。建议设置为0.5~0.75(默认0.5是平衡性能与内存使用的合理值)。
配置方法:修改/etc/rabbitmq/rabbitmq.conf文件,添加vm_memory_high_watermark_paging_ratio = 0.6。
3. 配置磁盘空间阈值(disk_free_limit)
当磁盘剩余空间低于disk_free_limit阈值时,RabbitMQ会阻塞生产者并停止内存换页,避免因磁盘空间不足导致服务崩溃。有两种配置方式:
disk_free_limit.absolute = 500MB),适合固定磁盘空间的服务器;disk_free_limit.relative = 1.0),适合动态调整磁盘空间的场景。/etc/rabbitmq/rabbitmq.conf文件,添加disk_free_limit.absolute = 500MB。4. 启用持久化机制减少内存占用
deliveryMode=2(Java)或MessageProperties.PERSISTENT_TEXT_PLAIN(Spring Boot),将消息同时写入磁盘和内存,避免重启后丢失,但会增加磁盘I/O;durable=true(Java)或durable: true(Spring Boot),确保元数据持久化,避免节点重启后重建元数据。5. 监控内存使用状态
通过RabbitMQ管理插件(rabbitmq-plugins enable rabbitmq_management)或命令行工具监控内存使用情况:
http://服务器IP:15672(默认账号guest/guest),查看“Overview”中的“Memory”指标(如Used、Limit);rabbitmqctl status | grep 'Memory usage'(查看内存使用详情)、rabbitmqctl list_queues name memory(查看各队列的内存占用)。6. 清理无用队列与消息
定期清理未使用的队列(如rabbitmqctl delete_queue 队列名)和过期消息(通过TTL设置,如channel.basicPublish(exchangeName, routingKey, properties, message)中设置properties.setExpiration("60000"),单位毫秒),减少内存中的无效数据占用。