长连接服务调高连接上限是防止用户被踢掉最直接有效的手段,但需要结合服务器资源和业务场景合理调整,否则可能引发新问题。
长连接用户被踢怎么解决?调高连接上限是第一步
用户被踢,多半是连接数撞上了服务硬上限,无论是系统层面的文件描述符耗尽,还是应用层连接池满,调高连接上限是最直接的应对手段,但不少人在实际操作中只改了一个参数,结果该掉线还是掉线,下面几个层面,缺一不可。
系统层面:修改文件描述符限制
操作系统默认的单进程打开文件数通常只有1024,对长连接服务来说,这点数量连零头都不够。
- 查看当前限制:
ulimit -n或cat /proc/[pid]/limits - 修改
/etc/security/limits.conf,添加如下两行:soft nofile 1000000 hard nofile 1000000 - 如果使用 Systemd,还需在对应 service 文件中设置
LimitNOFILE=infinity - 生效方式:重启服务或重新登录会话
大多数情况下,改完文件描述符后,连接数上限会提升一大截,但仅仅改这里还不够,应用层和内核层也有自己的“天花板”。
应用层面:调整中间件或服务连接池
不同服务对连接数的控制方式不同,但核心逻辑一致:找到参数名,改成你需要的值。
- Nginx:修改
worker_connections,配合worker_processes算出最大并发连接数,公式:worker_processes worker_connections,但实际还要考虑系统限制。 - Redis:修改
maxclients,默认10000,调高时注意内核参数somaxconn和tcp_backlog也要同步提升。 - MySQL:修改
max_connections,但连接数过高会大量消耗内存,建议配合max_user_connections做单用户限制。 - Tomcat / Jetty:修改连接器中的
maxThreads和acceptCount,前者是线程池大小,后者是请求队列长度。
参数并非越大越好,调高后必须监控资源变化,否则可能引发“雪崩”。
网络层面:调整内核参数

应用层允许连接,但内核反悔的情况很常见,当连接数达到几万甚至几十万时,内核的 net.core.somaxconn 和 net.ipv4.tcp_max_syn_backlog 会成为瓶颈。
net.core.somaxconn:默认128,建议加大到1024或更高,对应listen队列长度。net.ipv4.tcp_max_syn_backlog:默认1024,建议改为4096以上,用于半连接队列。net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle:前者可开启以复用TIME_WAIT连接,后者在新内核中已废弃,不要乱开。net.ipv4.ip_local_port_range:默认32768-60999,如果短期建立大量连接,可以扩大范围,比如1024-65535。
修改后执行 sysctl -p 生效,业内专家指出,很多长连接服务被踢,根源出在内核参数上,应用层反而允许得更高。
长连接连接上限设置多少合适?从系统参数到应用配置
连接数不是越高越好,没有一个“万能值”,如果设置得过大,服务器会在高并发下迅速耗尽内存或CPU,导致比被踢更严重的连锁反应。
评估单连接资源消耗
每一条长连接都会占用内存,包括TCP缓冲区、socket结构体、应用层连接对象等。
- 纯TCP连接:约2-4KB(取决于内核版本)
- 加上应用层缓存(如心跳包、待发送队列):可能达到10-50KB
- 保守估计:1万连接至少占用200MB内存,100万连接则接近20GB
内存大小直接决定了连接上限的理论天花板,但实际中还要考虑CPU、带宽、文件描述符等因素。
不同业务场景的建议值
| 业务类型 | 单机连接数建议 | 注意事项 |
|---|---|---|
| 即时通讯(消息推送) | 5万-50万(视内存而定) | 空闲连接多,可适当激进,但需配心跳检测 |
| 在线游戏(实时对战) | 1万-5万 | 要求低延迟,连接数过高会导致CPU调度开销变大 |
| 物联网设备接入 | 10万-100万 | 设备端通常低功耗,需控制心跳频率,避免被踢 |
|
WebSocket 应用 |
2万-10万 | 结合反向代理做负载均衡,单机不宜过高 |
是行业共识认为的合理范围,但具体数值得通过压力测试来确定。
压力测试验证连接上限
不要凭感觉改参数,用工具压一下,看服务在达到设定上限时的表现。
- 推荐工具:
wrk、locust、ab或自定义脚本 - 测试步骤:
- 逐步增加并发连接数,从1万开始,每次加1万。
- 观察响应时间、错误率、系统资源占用。
- 当响应时间出现明显上升或错误率超过1%时,当前连接数就是实际上限。
- 在这个值的基础上打八折,作为生产环境的连接上限。
长连接掉线原因及解决:调高上限后的注意事项
调高连接上限后,用户可能仍然掉线,甚至比之前更频繁,这通常不是上限本身的问题,而是其他环节没有跟上。
常见掉线原因
- 服务器资源耗尽:连接数上去后,内存或CPU100%,导致无法处理新连接或心跳超时。
- 应用程序线程池阻塞:连接数超过线程池处理能力,请求被丢弃。
- 网络带宽打满:大量连接产生流量,超过出口带宽,丢包率高。
- 内核参数未同步:
net.ipv4.tcp_keepalive_time太小,空闲连接被过早断开。 - 负载均衡器限制:连接数被前端Nginx或LB的上限挡住。
调高上限后的监控指标
- 文件描述符使用率:接近限制时报警。
- 内存使用率:连接数越多,内存占用越大,确保有足够余量。
- CPU使用率:连接数增加后,上下文切换频繁,CPU会明显上升。
- 连接建立速率:每秒新建连接数,如果过高,说明有大量重连,需排查原因。
- 心跳超时数:调高上限后,如果心跳超时数增加,说明服务器处理不过来,需要优化心跳机制或升级硬件。
长连接服务限流调整方法:从被动防踢到主动优化
调高连接上限是被防御,但更聪明的做法是主动限流,避免服务被潮水般的连接冲垮,限流不是不让用户连接,而是让服务在承受范围内平稳运行。

限流策略选型
- 令牌桶:允许一定程度的突发流量,适合大部分场景。
- 漏桶:平滑流量,严格限制速率,适合推送类服务。
- 队列+拒绝:当连接数超过阈值时,将请求排队,排队超时则拒绝,适用于游戏匹配等场景。
常见限流实现
- Nginx 限流模块:
limit_conn_zone和limit_req_zone,可限制单个IP或总连接数。 - 应用层限流:使用
RateLimiter(如Guava、Resilience4j)或自定义计数器。 - 中间件限流:Redis 的
INCR配合过期时间,实现简单计数器。
负载均衡+连接复用
单机上限再高,也有天花板,将流量分散到多台机器,同时复用已有连接,是防止被踢的终极方案。
- 使用 LVS、Nginx 或云厂商的 LB 做连接分发。
- 应用层连接池复用,减少握手次数,降低连接数峰值。
- 长连接服务配置健康检查,主动剔除异常连接。
长连接连接上限调高防踢常见问题解答
问:调高连接上限后,服务器内存没满但用户频繁掉线,是什么原因?
答:可能不是内存问题,而是CPU或线程池瓶颈,当连接数增加,上下文切换和锁竞争会急剧上升,导致单个请求处理时间变长,客户端超时断开,建议先压测定位响应时间,再优化线程模型或使用异步IO。
问:内存2GB的云服务器,长连接连接上限设置多少比较保险?
答:2GB内存除去系统和服务占用,可用内存约1.5GB,按单连接消耗10KB估算,上限约15万,但实际受CPU和带宽限制,建议从5万起步逐步压测,以响应时间稳定不超过200ms为准,如果业务心跳包频繁,单连接消耗更高,上限应再降低。
问:调高连接上限后,是否需要同步调整客户端的重连策略?
答:需要,如果服务端上限提升,但客户端重连间隔过短,连接断开后会瞬间发起大量重连,导致服务端被“冲垮”,建议客户端使用指数退避重连,并设置最大重连间隔,配合服务端限流,让调高上限的效果最大化。
