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、调大端口范围缓解;入站方向影响小。