Ubuntu 上调整 RabbitMQ 连接数的完整步骤
一 核心原理与上限
- RabbitMQ 的每个连接占用一个 socket 描述符,而 socket 是 文件描述符(fd) 的子集。可用连接上限受限于系统的 fd 配额与 RabbitMQ 配置,二者是“此消彼长”的关系。
- 默认值通常为:文件句柄数 1024,可用 socket 约 829。社区常见经验公式为:最大连接数 ≈ (文件句柄数 − 100) × 0.9 − 2(取整),因此提升 fd 上限是扩容连接数的前提。
- 当达到上限时,RabbitMQ 会在 AMQP 层拒绝新连接(表现为客户端握手后无法完成建立),而不是单纯在 TCP 层拒绝。可通过管理插件或命令行查看当前用量与上限。
二 系统级与 systemd 服务层设置
- 调整系统级 fd 上限(内核与登录级):
- 内核参数(/etc/sysctl.conf):设置 fs.file-max=655350,执行
sysctl -p 生效。
- 登录级限制(/etc/security/limits.conf):为运行 RabbitMQ 的用户(如 rabbitmq 或 root)添加:
* soft nofile 65535
* hard nofile 65535
- 注:某些环境还需在 /etc/pam.d/common-session 或 /etc/pam.d/sshd 中确保启用 pam_limits.so,以便登录会话继承 limits。
- 调整 systemd 服务单元限制(Ubuntu 16.04 及以后常用 systemd):
- 编辑服务文件(常见路径:/lib/systemd/system/rabbitmq-server.service 或 /etc/systemd/system/rabbitmq-server.service.d/override.conf),在 [Service] 下增加:
- 重新加载并重启:
systemctl daemon-reload
systemctl restart rabbitmq-server
- 验证:
- 查看进程 fd 软硬限制:
prctl -n limit -p $(pidof beam.smp)
- 查看 RabbitMQ 节点状态:
rabbitmqctl status,关注 file_descriptors.total_limit 与 file_descriptors.sockets_limit。
三 RabbitMQ 服务参数设置
- 在配置文件(经典格式 rabbitmq.config 或 advanced.config)中为 AMQP 监听器设置连接上限与 acceptor 数量:
- 示例(经典格式 .config):
[
{rabbit, [
{tcp_listeners, [5672]},
{num_tcp_acceptors, 10},
{connection_max, 10000}
]}
].
- 生效:
systemctl restart rabbitmq-server
- 重要说明:
- 实际可达最大连接数 ≈ connection_max + num_tcp_acceptors − 1。例如
connection_max=10000 且 num_tcp_acceptors=10 时,实测上限约为 10009。
- 若使用较新版本并采用 sysctl 格式(rabbitmq.conf),可用等效的
listeners.tcp.default、num_acceptors.tcp、connection_max 项进行配置(语义一致)。
四 按 vhost 限流与运维建议
- 按 vhost 限制并发连接数(精细化配额):
- 设置 vhost 最大连接数:
rabbitmqctl set_vhost_limits -p <vhost_name> '{"max-connections": 256}'
- 禁用该 vhost 的连接:
'{"max-connections": 0}'
- 解除限制:
'{"max-connections": -1}'
- 运维要点:
- 客户端务必开启 心跳(heartbeat) 与合理的 重连退避,避免产生大量半开或无效连接。
- 达到上限时优先检查:系统 fd 与 systemd LimitNOFILE、RabbitMQ 的 connection_max 与 num_tcp_acceptors、以及是否存在连接泄漏。
- 监控与告警:关注
rabbitmqctl status 中的 file_descriptors.sockets_used / sockets_limit,以及管理界面的连接数趋势。