人人都会AI编程

文件句柄限制、端口范围调整

更新时间:2026-07-12

在高并发服务器场景下,默认的系统资源限制往往不足以支撑大量并发连接。常见的两个瓶颈是:可打开的文件句柄数量不足,以及可用的临时端口范围过窄。适时调整这两个参数,可以有效避免“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 统计进程当前打开的句柄数,确认是句柄泄漏还是确实需要调高限制。

合理调优这两项参数,是保障高并发服务平稳运行的基础操作。