生产环境必须同时调整进程级和系统级文件句柄限制。先检查当前软限制、进程实际使用量及系统总上限,再通过limits.conf和sysctl.conf永久配置,并在systemd服务中显式声明limitnofile。

生产环境必须同时调整进程级和系统级两层限制,缺一不可。只改单侧容易在高并发时突然报 Too many open files,且排查困难。
确认当前限制是否已成瓶颈
先检查三项关键数值:
-
当前会话软限制:运行
ulimit -n,常见默认值是 1024 或 65535;低于 65535 基本需调高 -
当前进程实际使用量:查目标服务 PID(如
pgrep -f nginx),再执行ls /proc/PID/fd | wc -l,若接近软限制的 80%,说明已临界 -
系统总上限:运行
cat /proc/sys/fs/file-max,建议该值 ≥ 单机预期最大并发连接数 × 平均每进程句柄数(例如 10 万连接 × 1.2 ≈ 12 万)
永久设置每个进程的最大文件数
推荐修改 /etc/security/limits.conf,这是 PAM 模块控制的标准方式,对所有登录用户和服务生效:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 追加以下四行(* 表示所有普通用户,不作用于 root;如需指定用户,把 * 换成用户名):
* soft nofile 65535<br>* hard nofile 65535<br>* soft nproc 65535<br>* hard nproc 65535
- 确保
/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/login(RHEL/CentOS)中含有一行:session required pam_limits.so - 修改后需重新登录或重启服务进程(如 systemd 服务要
systemctl daemon-reload && systemctl restart xxx),仅改配置不重启无效
同步提升系统级总文件句柄上限
避免进程限制调高后被全局卡死:
- 临时生效(验证用):
sysctl -w fs.file-max=1048576 - 永久生效:向
/etc/sysctl.conf追加一行:fs.file-max = 1048576 - 立即加载新配置:
sysctl -p - 注意:该值不是越大越好,应按物理内存估算——一般每 1000 个句柄约占用 1KB 内核内存,1GB 内存服务器设到 100 万较稳妥
验证与应用启动适配
很多服务(如 Nginx、Redis、Java 应用)在启动时读取当时 shell 的 ulimit 值,之后不再更新:
- 对 systemd 服务,需在 unit 文件中显式声明,例如在
[Service]段添加:LimitNOFILE=65535<br>LimitNPROC=65535
- 验证方法:启动后查进程 limits:
cat /proc/PID/limits | grep "Max open files",确保显示值与预期一致 - 切勿依赖
ulimit -n 65535临时命令启动服务——它只对当前终端有效,脱离终端即失效










