改了maxclients但连接数卡在10000,根本原因是系统级限制拦住了它:redis启动时自动将maxclients调低至ulimit -n - 32,且宝塔用systemd管理,默认limitnofile不足,必须同步修改redis.conf、systemd服务配置和内核参数三处才生效。

为什么改了 maxclients 但连接数卡在 10000 不动
根本不是 Redis 配置没生效,而是系统级文件描述符限制拦住了它。Redis 启动时会读取当前进程能打开的最大文件数(ulimit -n),然后自动把 maxclients 调低到 ulimit -n - 32(预留 32 个给自身)。宝塔 8.x+ 默认用 systemd 管理 Redis,而 systemd 的 LimitNOFILE 默认只有 4096 或 65536——哪怕你在 redis.conf 里写了 maxclients 100000,实际生效的仍是这个更低的值。
必须同步改三处:redis.conf + systemd + 内核参数
只改其中一处等于白改。验证是否真生效,不能只看配置文件,得查运行时值:
- 确认 Redis 当前
maxclients:运行redis-cli config get maxclients - 查进程实际能开多少文件:运行
cat /proc/$(pgrep redis-server)/limits | grep "Max open files",看Soft Limit和Hard Limit是否匹配你设的目标值 - 宝塔修改的
redis.conf路径通常是/www/server/redis/redis.conf,但改完不重启、不 reload systemd,配置不会加载
systemd 服务配置怎么改才不被宝塔覆盖
别直接编辑 /etc/systemd/system/redis.service,宝塔下次更新可能覆盖它。正确做法是用 systemctl edit redis 创建覆盖片段:
sudo systemctl edit redis
输入以下内容并保存:
[Service] LimitNOFILE=100000
然后执行:
systemctl daemon-reloadsystemctl restart redis- 验证:
systemctl show redis | grep LimitNOFILE应输出100000
注意:有些宝塔安装脚本会在 /www/server/redis/init.d/redisd 里硬写 ulimit -n 65536,如果改完 systemd 还是上不去,就去检查这个文件,删掉或改成匹配值。
内核参数和防火墙常被忽略的最终瓶颈
即使前两步都对了,Linux 内核的 net.core.somaxconn 和 net.ipv4.ip_local_port_range 也可能掐住高并发连接。尤其当你看到 netstat -s | grep overflowed 有非零输出,说明 TCP backlog 队列溢出,新连接被静默丢弃。
临时调高:
sudo sysctl -w net.core.somaxconn=65535sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
永久生效需写入 /etc/sysctl.conf。另外,云服务器务必检查安全组——6379 端口放行只是客户端访问,若你启用了集群或哨兵,还得额外放开集群总线端口(如 17000)和心跳端口,否则节点间握手失败,连接数再高也建不起来真正可用的分布式连接。











