linux调整最大文件描述符需进程级、用户级、系统级三层协同配置:systemd服务须在unit文件或system.conf中设limitnofile;/etc/security/limits.conf配用户级限制并启用pam_limits.so;/proc/sys/fs/file-max调系统级上限,三者缺一不可。

Linux 中调整系统最大文件描述符数,需分三层协同配置:进程级、用户级、系统级。单设某一层容易失效,尤其在 systemd 环境或高并发服务(如 Nginx、Java 应用)中,必须全部覆盖才能真正防止“Too many open files”导致的连接耗尽。
查看当前限制状态
先确认瓶颈在哪一层:
- 当前 Shell 进程软/硬限制:
ulimit -n(软限)、ulimit -Hn(硬限) - 当前用户所有进程已用 fd 总数:
lsof -u $USER | wc -l - 全系统已分配 & 最大 fd 数:
cat /proc/sys/fs/file-nr(三列:已分配|未使用|上限) - 系统全局上限值:
cat /proc/sys/fs/file-max
设置进程级限制(针对具体服务)
systemd 服务默认不读取 /etc/security/limits.conf,必须显式声明:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编辑服务单元文件,例如:
sudo systemctl edit nginx,添加:
[Service] LimitNOFILE=65535
- 若需统一作用于所有 systemd 服务,修改主配置:
/etc/systemd/system.conf,在[Manager]下加:DefaultLimitNOFILE=65535 - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart nginx
配置用户级持久限制
影响所有以该用户身份启动的非 systemd 进程(如手动运行的 Node.js、Python 脚本):
- 编辑
/etc/security/limits.conf,追加两行(以所有用户为例):
* soft nofile 65535 * hard nofile 1048576
- 确保 PAM limits 模块已启用:
echo "session required pam_limits.so" | sudo tee -a /etc/pam.d/common-session - 退出终端重新登录后生效;验证:
ulimit -n应显示 65535
调高系统级全局上限
这是底层兜底,决定整个系统能分配多少 fd,必须 ≥ 所有进程限制之和:
- 临时提升(重启失效):
sudo sysctl -w fs.file-max=2097152 - 永久生效:向
/etc/sysctl.conf追加:fs.file-max = 2097152 - 立即加载:
sudo sysctl -p - 补充(可选):若单个进程需突破默认 1048576 上限,还可调
fs.nr_open(需 root 权限)
调完记得用真实负载验证:启动服务后,检查 ls /proc/$(pidof your_app)/fd | wc -l 是否接近设定值,且不再报错。不复杂但容易忽略层级匹配。










