在高并发服务器场景下,默认的系统资源限制往往不足以支撑大量并发连接。常见的两个瓶颈是:可打开的文件句柄数量不足,以及可用的临时端口范围过窄。适时调整这两个参数,可以有效避免“Too many open files”等错误,提升服务的承载能力。
1. 文件句柄限制(file descriptor / ulimit -n)
Linux 中一切皆文件,网络套接字、管道、普通文件等都消耗文件句柄。每个进程默认允许打开的文件句柄数量通常只有 1024,对于 Web 服务器、数据库或代理这类需要同时处理成千上万连接的进程来说远远不够。
查看当前限制:
ulimit -n # 查看当前 shell 的软限制
ulimit -Hn # 查看硬限制(上限)
临时调整(仅对当前 shell 及其子进程生效):
ulimit -n 65536 # 将软限制提升到 65536
永久调整:
修改 /etc/security/limits.conf,为特定用户或所有用户设置限制:
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
soft是当前限制,进程可自行提升至hard值;hard是上限,只能由 root 调高;nofile表示打开的文件数量。
系统级的全局上限由内核参数 fs.file-max 决定:
sysctl fs.file-max # 查看系统级上限
sysctl -w fs.file-max=2097152 # 临时调高
echo "fs.file-max = 2097152" >> /etc/sysctl.conf # 永久生效
2. 临时端口范围调整(ip_local_port_range)
当客户端发起 TCP 连接时,内核会自动从临时端口范围中分配一个本地端口。若此范围过小,在高并发短连接场景(如压测、反向代理到上游)下端口会被迅速耗尽,导致 Cannot assign requested address 错误。
查看当前范围:
sysctl net.ipv4.ip_local_port_range
输出示例:32768 60999,表示可用端口数约 28000 个。
调大范围:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
此举将可用端口数扩展到约 64000 个,大幅提高并发连接上限。
永久保持:
将配置写入 /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf:
net.ipv4.ip_local_port_range = 1024 65535
然后执行 sysctl -p 使其生效。
实用提示:
- 若需修改正在运行的守护进程的限制,仅靠全局配置不够,还需在服务启动脚本中(或 systemd service 文件中用
LimitNOFILE)显式设置限制。 - 端口范围一般不宜包含 0-1023 的知名端口,避免与应用监听冲突;下限通常设为 1024 或 32768,上限可设为 65535。
- 遇到“Too many open files”时,可先用
lsof -p <PID>或ls /proc/<PID>/fd | wc -l统计进程当前打开的句柄数,确认是句柄泄漏还是确实需要调高限制。
合理调优这两项参数,是保障高并发服务平稳运行的基础操作。