CentOS下RabbitMQ性能调优关键技巧
vm_memory_high_watermark参数设置内存使用阈值(建议0.4-0.66,即物理内存的40%-66%),当内存使用超过该值时,RabbitMQ会触发流控(如阻塞生产者)以避免内存溢出。可通过rabbitmqctl set_vm_memory_high_watermark 0.6动态调整,或修改rabbitmq.conf文件永久生效。vm_memory_high_watermark_paging_ratio参数定义内存使用达到高水位的多少比例时开始将消息分页到磁盘(默认0.5,即高水位的50%)。建议设置为0.75,延迟分页以减少对生产性能的影响。disk_free_limit参数设置磁盘最小可用空间(建议500MB以上或内存的1倍,如disk_free_limit.absolute = 500MB)。当磁盘空间不足时,RabbitMQ会阻塞生产者,避免因磁盘写满导致服务崩溃。x-queue-mode=lazy(消息尽量落盘),减少内存占用,但会牺牲少量延迟(适合离线处理场景)。pika库的basic_publish批量提交)。confirmSelect(),通过异步回调接收ACK/NACK(而非事务),提升发送吞吐量;对NACK消息实现重试或落盘缓冲,确保可靠性。delivery_mode=2(持久化),结合Quorum Queues保证可靠性;对日志/埋点类消息使用非持久化(delivery_mode=1),换取更高性能。basic.qos(prefetchCount)设置单个消费者未ACK的最大消息数(建议50-300,视业务处理耗时和内存而定)。避免prefetch过小(增加延迟)或过大(导致消费者内存堆积)。manual_ack模式,处理成功后再发送ACK;失败时nack并重试或发往死信队列(DLX)。消费端必须实现幂等(如唯一msgId、DB唯一索引、Redis setnx),避免重复处理。ulimit -n(如100k),支持大量并发连接和文件句柄(RabbitMQ每个连接/Channel都会占用文件句柄)。atime(noatime),调整IO调度为noop(SSD)或deadline(传统磁盘),提升IO性能。/etc/sysctl.conf,调整以下参数以支持高并发:net.core.somaxconn = 65535 # 监听队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列大小
net.ipv4.tcp_tw_reuse = 1 # 复用TIME_WAIT连接
执行sysctl -p使配置生效。messages_ready(待处理消息数)、messages_unacknowledged(未ACK消息数)、consumers(消费者数量);publish_rate(发布速率)、deliver_rate(投递速率)、ack_rate(ACK速率)、Confirm成功率、Nack率、流控触发次数。messages_ready > 100k(队列积压告警);messages_unacknowledged占比超过30%(消费滞后告警);x-message-ttl(如1小时),超时消息自动删除或进入DLX,避免消息无限堆积;