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 直接调到十万级:每个连接都要占内存与句柄,实例往往在连接数达标前先被内存压垮,也会放大耗尽端口与句柄的风险。