首页/数据/数据库速查/连接数上限(maxclients 与文件句柄)
Redis 运维与场景124 条

连接数上限(maxclients 与文件句柄)

maxclients 决定最大连接数(默认 10000),受系统文件句柄限制:Redis 启动时会按 ulimit -n 自动调整并记录到日志。

数据库速查数据更新于 2026-10-13

maxclients 与文件句柄

maxclients 决定 Redis 能同时接受多少客户端连接,默认 10000。但真正卡住连接数的是操作系统的文件句柄上限:Redis 启动时会按 ulimit -n 自动下调 maxclients,并把调整结果写进日志。因此调参数必须同时改配置与进程限制,只改一处不生效。

基本信息

参数名maxclients,配置文件或 CONFIG SET 动态修改
默认值10000(受 ulimit -n 限制时会被自动下调)
系统限制ulimit -n 与 systemd 的 LimitNOFILE
句柄预留内部使用与复制连接会占用若干句柄,不能只按连接数算
打满表现ERR max number of clients reached

典型使用场景

  • 连接数接近上限告警:先确认是业务增长还是连接泄漏,再决定是否调大
  • 容器化部署:容器内的文件句柄限制常与宿主机不同,需要单独核对
  • systemd 托管:不配置 LimitNOFILE 时重启后又回到默认值,参数会被悄悄改小
  • 大量短连接:连接创建速率高时句柄回收不及时也会触发上限
  • 主从同机部署:主库与副本各自占用句柄,容量要合起来评估

查看与调整

查看与调整
redis-cli CONFIG GET maxclients
redis-cli INFO clients | grep -E "connected_clients|rejected_connections"
ulimit -n                                  # 当前 shell 的文件句柄上限
cat /proc/$(pgrep -f redis-server | head -1)/limits | grep 'open files'
# 配置文件写 maxclients 20000,同时确认服务单元的文件句柄上限不低于该值
systemctl show redis -p LimitNOFILE        # 查看 systemd 实际生效的限制

输出逐列读法

观测项含义判读
connected_clients当前已连接客户端数持续贴近上限需查泄漏或攻击
rejected_connections因超过上限被拒绝的连接数增长说明确实在拒绝业务请求
blocked_clients阻塞在列表或流读取上的连接异常大说明消费者处理不过来
打开文件数进程实际持有的句柄接近上限时新连接会失败
Redis 启动日志里会写明「maxclients 被调整为某值」这类信息,怀疑限制没生效时先翻启动日志。
把 maxclients 直接调到十万级:每个连接都要占内存与句柄,实例往往在连接数达标前先被内存压垮,也会放大耗尽端口与句柄的风险。

易错点

  • 只改配置文件忘记 systemd 的文件句柄限制:实际生效值仍是旧的,参数看似改了却没效果
  • 连接打满就无脑调大上限:连接池泄漏与短连接未复用才是根因,调大只是把故障推后
  • 容器环境按宿主机限制评估容量:容器内限制通常更低,容量估算会明显偏大
  • 忽略被拒绝的连接数指标:业务已在报错但监控只盯当前连接数,问题发现滞后

数据来源与参考

  • Redis 官方文档: maxclients
  • Redis 官方文档: 客户端连接

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌