Linux 服务器的最大连接数受什么限制?

Linux 服务器最大连接数受文件描述符上限、内核网络参数(somaxconn、端口范围)、Web 服务器 worker 配置、硬件资源、负载均衡器、应用自身限制六层约束。本文逐层讲解并给出排查调整方法。

最佳实践
网络请求路由与访问控制示意

**连接数不是一个开关,而是六层瓶颈中最小的那个。**从高并发报错往回查,按下面顺序逐层核对。

1. 文件描述符上限(最常见瓶颈)

每个 TCP 连接消耗一个文件描述符。先查:

ulimit -n                          # 当前 shell 软限制,常见 1024
cat /proc/sys/fs/file-max          # 系统级上限

修改方式:临时用 ulimit -n 65535;永久改 /etc/security/limits.conf(注意 systemd 服务还要设 LimitNOFILE),系统级调 fs.file-max。

2. 内核网络栈参数

net.core.somaxconn                 # listen 队列长度,默认常 4096,高并发需调大
net.core.netdev_max_backlog        # 网卡收包队列
net.ipv4.ip_local_port_range       # 出站连接的本地端口范围(主动连接别人时是瓶颈)
net.ipv4.tcp_max_syn_backlog       # SYN 半连接队列
net.ipv4.tcp_tw_reuse              # TIME_WAIT 复用

改 /etc/sysctl.conf 后 sysctl -p 生效。

3. Web 服务器配置

  • Nginx:worker_processes × worker_connections 决定理论并发上限;
  • Apache:MPM 模式的进程/线程数;
  • 应用运行时:Tomcat 线程池、Node.js 单线程模型、PHP-FPM 进程数等各有自己的天花板。

4. 硬件资源

每个连接消耗内存(内核缓冲 + 应用层结构),CPU 处理中断和上下文切换。10 万连接大约消耗 GB 级内存——内存通常是连接数的第一道硬墙。

5. 前置代理/负载均衡

前面挂了 Nginx、HAProxy 或云 LB 时,它们各自有连接数限制,可能成为比后端更早触顶的瓶颈。

6. 应用自身限制

数据库连接池、消息队列客户端、应用框架的连接上限都要查——有时"服务器满了"其实只是连接池配小了。

排查套路

连接打满报错时,按"应用池 → Web 服务器 → ulimit → 内核参数 → 内存"从内到外查,每一层用数据验证(ss -s 看连接数、/proc/<pid>/limits 看进程实际限制)。

常见问题(FAQ)

Q:单机最大连接数理论上限是多少?
监听端口的服务端连接数不受 65535 端口限制(那是客户端出站端口的约束),理论上 FD 和内存够就能到百万级(C10M 问题)。

Q:改了 limits.conf 为什么不生效?
systemd 管理的服务不读 limits.conf,要在 unit 文件里设 LimitNOFILE= 并 systemctl daemon-reload。

Q:TIME_WAIT 太多影响新建连接吗?
出站连接多时会有影响(占本地端口),可通过 tcp_tw_reuse、调大端口范围缓解;入站方向影响小。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台