要提升Linux并发TCP连接数,需同步调整进程级、服务级和内核级三层文件描述符限制:修改/etc/security/limits.conf设用户级上限,配置systemd服务LimitNOFILE,再调大/proc/sys/fs/file-max及net.core.somaxconn等内核参数。

要让 Linux 系统支持更多并发 TCP 连接,核心是解决“每个连接占用一个文件描述符(FD)”这一限制。系统默认只允许单进程打开 1024 个文件,实际可用连接约 1014 个——这远远不够。真正起作用的是三层限制:进程级、服务级、内核级,必须同步调整,缺一不可。
修改用户级文件描述符限制
这是大多数服务(如 SSH 登录后启动的程序)生效的第一道门槛。
- 编辑
/etc/security/limits.conf,添加明确行(别只用*,root 和服务用户需单独写):root soft nofile 65536 root hard nofile 65536 www-data soft nofile 65536 www-data hard nofile 65536
注意:soft 值不能超过 hard 值;
www-data要替换成你服务实际运行的用户。 - 确保 PAM 模块已启用:检查
/etc/pam.d/common-session(Ubuntu/Debian)或/etc/pam.d/system-auth(CentOS/RHEL)是否含:session required pam_limits.so
- 修改后必须重新登录(不是
su -,而是断开 SSH 再重连),否则不生效。
配置 systemd 服务的文件描述符上限
Nginx、Redis、Node.js 等现代服务由 systemd 管理,完全忽略 limits.conf。
- 全局设置(推荐初试):
sudo systemctl edit --full systemd-system.conf
在
[Manager]下添加:DefaultLimitNOFILE=65536
- 或为单个服务定制(更安全):
sudo systemctl edit nginx.service
写入:
[Service] LimitNOFILE=65536
- 修改后务必执行:
sudo systemctl daemon-reload sudo systemctl restart nginx
- 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files"
调整内核级参数
这是系统总容量的“天花板”,决定所有进程加起来最多能开多少 FD。
- 查看当前值:
cat /proc/sys/fs/file-max
默认常为几万,建议设为
2097152(200 万)或更高(64GB 内存服务器可稳撑):echo 2097152 | sudo tee /proc/sys/fs/file-max
- 永久生效:写入
/etc/sysctl.conf:fs.file-max = 2097152 net.core.somaxconn = 65535
somaxconn控制监听队列长度,避免新连接被丢弃。 - 加载配置:
sudo sysctl -p
补充关键项(按需启用)
-
本地端口范围(影响作为客户端发起连接的能力):
net.ipv4.ip_local_port_range = 1024 65535
-
TIME_WAIT 处理(高短连接场景必调):
net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1
-
连接跟踪上限(若启用
nf_conntrack):net.netfilter.nf_conntrack_max = 1048576
不复杂但容易忽略。


















