RabbitMQ 在 Ubuntu 的资源限制设置指南
一 文件描述符与系统级限制
- 生产环境建议为运行 RabbitMQ 的用户(通常为 rabbitmq)将可打开文件描述符提升到至少 65536,开发环境 4096 通常足够。注意区分两层限制:内核级 fs.file-max 必须高于用户级 ulimit -n。验证命令:
- 查看进程实际限制:cat /proc/$(rabbitmqctl status | grep pid | awk ‘{print $2}’)/limits
- 查看系统级上限:cat /proc/sys/fs/file-max
- 使用 systemd 的 Ubuntu(16.04+ 常见):创建目录与覆盖文件 /etc/systemd/system/rabbitmq-server.service.d/limits.conf,写入:
- [Service]
- LimitNOFILE=300000
- 执行 systemctl daemon-reload && systemctl restart rabbitmq-server 使配置生效。
- 不使用 systemd 的旧版或 SysV 场景:
- 在 /etc/security/limits.conf 增加(示例为 rabbitmq 用户):
- rabbitmq soft nofile 65536
- rabbitmq hard nofile 65536
- 确保 PAM 启用 limits:在 /etc/pam.d/common-session 与(若存在)/etc/pam.d/common-session-noninteractive 中加入 session required pam_limits.so
- 重新登录或重启后生效。
- 直接在服务启动前设置 ulimit(不推荐长期使用):编辑 /etc/default/rabbitmq-server,加入 ulimit -n 65536,重启服务生效。
二 RabbitMQ 内存与磁盘水位设置
- 内存水位(避免 OOM 与阻塞生产者):
- 配置文件 /etc/rabbitmq/rabbitmq.conf:
- 相对值(推荐):vm_memory_high_watermark.relative = 0.4~0.7
- 绝对值:vm_memory_high_watermark.absolute = 2GB
- 运行时动态调整:rabbitmqctl set_vm_memory_high_watermark 0.6(立即生效,重启后失效,需写回配置以持久化)。
- 磁盘水位(防止磁盘被写满):
- 配置文件 /etc/rabbitmq/rabbitmq.conf:
- 绝对值:disk_free_limit.absolute = 50MB(默认)
- 相对值:disk_free_limit.relative = 1.0~2.0(相对于机器内存)
- 运行时动态调整:rabbitmqctl set_disk_free_limit 20GB 或 rabbitmqctl set_disk_free_limit mem_relative 1.5(立即生效,重启后失效,需写回配置以持久化)。
- 工作机制要点:
- 内存超过水位时,节点会阻塞生产者,避免进一步内存压力。
- 磁盘低于水位时,同样阻塞生产者,且在内存压力下会尝试将消息换页到磁盘以释放内存(持久化消息本就有磁盘副本)。
三 验证与运维要点
- 查看生效的文件描述符与进程限制:
- rabbitmqctl status(查看 “file_descriptors” 项)
- cat /proc/$(rabbitmqctl status | grep pid | awk ‘{print $2}’)/limits
- 管理界面与监控:
- 启用管理插件:rabbitmq-plugins enable rabbitmq_management,访问 http://:15672 查看 Overview 中的文件描述符与内存/磁盘指标。
- 启用指标暴露:rabbitmq-plugins enable rabbitmq_prometheus,Prometheus 抓取 :15692/metrics,关注 rabbitmq_node_mem_used、rabbitmq_node_disk_free 等关键指标。
- 注意事项:
- 调整 limits 后需重启相关服务;运行中进程的限制不可直接更改。
- 磁盘告警检查默认至少每 10 秒一次,接近阈值时会提高频率;将阈值设得过低在消息快速换页场景下仍可能在两次检查间耗尽磁盘,保守做法是将 disk_free_limit.relative 设为与内存相当或更高。