这个坑值得记一笔。Redis 6.2 实例 maxclients 是一万,监控上 connected_clients 撞到顶之后,新连接一律报 ERR max number of clients reached,重启应用半小时又满,可实际并发并不高。

刚开始盯着「连接池的上限按线程数配,容器扩了几十个副本,总量直接翻倍」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。应用每个请求都新建连接,用完不主动关,句柄全挂在服务端;没有设置空闲超时,断网留下的连接一直占着不释放;监控采集器在每个节点上都开了几十条长连接,平时没人注意。

第一件事是看客户端总数和拒绝次数

redis-cli info clients && redis-cli info stats | grep rejected_connections

然后按来源地址统计连接分布

redis-cli client list | awk '{print $2}' | cut -d= -f2 | sort | uniq -c | sort -rn | head

给空闲连接加上超时并抬高上限

redis-cli config set timeout 300 && redis-cli config set maxclients 20000

末了确认拒绝计数停止增长

redis-cli info stats | grep -E 'rejected_connections|total_connections_received'

怎么算真的好了,看的是同一批现象。connected_clients 回落到两千以内,rejected_connections 不再增长,业务侧的连接报错消失且重连正常。

补一句。调大 maxclients 同时要抬 nofile,否则进程先撞句柄上限;根子还是连接没复用,加参数只是把时间往后拖。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189