Linux下RabbitMQ性能优化技巧
合理设置内存水位线是避免RabbitMQ因内存溢出触发流控的关键。通过vm_memory_high_watermark参数限制内存使用比例(建议0.6-0.7,即60%-70%),当内存使用达到阈值时,RabbitMQ会将内存中的消息换页到磁盘,释放内存;vm_memory_high_watermark_paging_ratio参数控制开始换页的内存比例(建议0.5-0.75,即50%-75%),避免过早或过晚换页。例如,内存为16GB时,设置vm_memory_high_watermark=0.6允许使用9.6GB内存,vm_memory_high_watermark_paging_ratio=0.5则在内存使用达到4.8GB时开始换页。
disk_free_limit参数设置磁盘最小剩余空间(建议2GB或内存的1倍,如disk_free_limit=2GB),当磁盘空间不足时,RabbitMQ会阻止生产者发送消息,避免磁盘写满导致服务崩溃。CachingConnectionFactory可缓存Connection和Channel,提升性能。channel.confirmSelect()开启确认模式,生产者发送多条消息后,调用channel.waitForConfirms()批量等待确认,减少网络往返次数(吞吐量可提升5-10倍)。同时,消费者需使用manual ack(channel.basicAck()),避免消息自动确认后处理失败导致丢失。通过channel.basicQos(prefetchCount)设置消费者预取的消息数量(建议10-100,根据消息大小和消费者处理能力调整)。预取计数限制了消费者未确认的消息数量,避免单个消费者占用过多内存,实现消息公平分发(如多个消费者处理同一队列时,避免某个消费者过载)。
根据业务场景选择合适的队列类型:
durable=true、deliveryMode=2),确保消息不丢失,但性能开销大(适合金融交易等关键业务);deliveryMode=1),提升性能,但服务器重启后消息丢失(适合日志收集、实时通知等允许少量丢失的场景);x-queue-mode=lazy参数设置,消息尽可能保存在磁盘上,减少内存占用(适合消息堆积场景,如大数据处理)。rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'设置镜像队列,队列在所有节点上复制,节点宕机后消息依然可用(适合关键业务,但会增加同步开销)。/etc/sysctl.conf,增加TCP backlog(net.core.somaxconn=4096、net.ipv4.tcp_max_syn_backlog=8192)、开启TCP keepalive(net.ipv4.tcp_keepalive=true),提升连接稳定性;/etc/security/limits.conf,设置rabbitmq soft nofile 65536、rabbitmq hard nofile 65536,避免大量连接导致文件句柄耗尽。使用RabbitMQ自带的管理插件(rabbitmq-plugins enable rabbitmq_management)或第三方工具(如Prometheus+Grafana)监控关键指标:内存使用率、磁盘剩余空间、消息堆积数、消费者积压数、Erlang run_queue(调度器负载)。通过监控及时发现瓶颈(如内存溢出、磁盘I/O过高),针对性调整配置。