Linux网络连接数上限直接受文件描述符限制制约,需从用户级(ulimit、limits.conf、systemd配置)、进程级(fs.nr_open)和系统级(fs.file-max)三层协同调优,并通过ulimit -Sn/-Hn、cat /proc/sys/fs/file-max等命令分层诊断瓶颈。

Linux 网络连接数上限直接受文件描述符(file descriptor)限制制约,因为每个 TCP 连接都会占用至少一个文件描述符。调优需从用户级、进程级和系统级三层协同入手,缺一不可。
查看当前限制情况
先确认瓶颈在哪一层:
- 当前会话的软硬限制:ulimit -Sn(软限制)、ulimit -Hn(硬限制)
- 系统总句柄上限:cat /proc/sys/fs/file-max
- 已用/已分配/最大值:cat /proc/sys/fs/file-nr(输出形如 1234 0 65536,第三列即当前
file-max) - 某进程实际打开数:lsof -p PID | wc -l
临时提升单次会话限制
适合测试或紧急恢复,退出终端即失效:
- 将软限制设为 65536:ulimit -Sn 65536
- 若权限允许,同步提高硬限制:ulimit -Hn 65536
- 注意:普通用户无法将软限制设得高于当前硬限制;root 可直接设高值
永久配置用户级限制
影响所有以该用户身份启动的进程(包括 systemd 服务),关键在三步:
- 编辑 /etc/security/limits.conf,追加(以通配符为例):
* soft nofile 65536
* hard nofile 65536 - 确保 PAM limits 模块启用:检查 /etc/pam.d/common-session 是否含
session required pam_limits.so,没有就添加一行 - 对 systemd 服务还需额外设置:编辑 /etc/systemd/system.conf,取消注释并修改
DefaultLimitNOFILE=65536,之后运行 systemctl daemon-reload
调整系统级全局限制
这是所有进程共享的“池子”,必须 ≥ 单个用户硬限制 × 并发用户数:
- 临时生效:sudo sysctl -w fs.file-max=2097152
- 永久生效:向 /etc/sysctl.conf 追加
fs.file-max = 2097152,再执行 sudo sysctl -p - 补充说明:fs.nr_open 是单进程能申请的最大 fd 数上限(默认常为 1048576),若你设的 hard nofile 超过它,需同步调高:
fs.nr_open = 4194304


















