只改 /etc/security/limits.conf 很大概率不生效,尤其对 systemd 服务;必须同步配置 pam(启用 pam_limits.so)、systemd 单元限制(如 limitnofile)及内核参数(fs.file-max 和 fs.nr_open),三者缺一不可。

直接说结论:只改 /etc/security/limits.conf 很大概率不生效,尤其对 systemd 服务(如 nginx、redis、java 应用)——必须同步处理 PAM 加载、systemd 单元限制、内核级 fs.file-max 三者,否则会卡在 “Too many open files” 上。
为什么 limits.conf 配置后 ulimit -n 没变?
根本原因不是配置写错了,而是 PAM 模块没被触发或没加载成功:
-
/etc/security/limits.conf本身只是配置文件,真正起作用的是pam_limits.so模块 - 该模块需在对应登录服务的 PAM 配置中显式启用,比如
/etc/pam.d/sshd或/etc/pam.d/login - 常见漏配:Ubuntu/Debian 默认在
/etc/pam.d/common-session中注释掉了session required pam_limits.so,需手动取消注释或追加 - 验证是否生效:退出当前会话,重新 SSH 登录(不能仅
su -或sudo -i),再运行ulimit -Sn和ulimit -Hn
systemd 服务完全无视 limits.conf 怎么办?
因为 systemd 启动的服务绕过了传统 PAM 登录流程,limits.conf 对它无效。必须在 systemd 层面单独设置:
- 查当前服务实际限制:
systemctl show -p LimitNOFILE nginx.service - 优先推荐覆盖方式(不改原始 unit 文件):
sudo mkdir -p /etc/systemd/system/nginx.service.d,然后新建override.conf,内容为:[Service]\nLimitNOFILE=65535
- 若需全局统一(所有服务):编辑
/etc/systemd/system.conf,取消注释并修改DefaultLimitNOFILE=65535 - 改完必须执行:
sudo systemctl daemon-reload && sudo systemctl restart nginx.service,daemon-reload不可省略
nofile 设到 65535 还是报错?检查三个上限是否都够
Linux 文件描述符有三层限制,缺一不可:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
用户级软/硬限制(
ulimit -Sn/-Hn):由limits.conf或systemd设置,决定单个进程上限 -
内核级总上限(
/proc/sys/fs/file-max):整个系统能分配的 fd 总数,必须 ≥ 所有进程nofile之和;低于目标值时,ulimit无法设高 -
内核参数
nr_open(/proc/sys/fs/nr_open):单个进程理论上能打开的最大 fd 数(硬编码上限),默认约 1048576;若你设nofile>nr_open,会静默截断为nr_open值
所以设 65535 前,先确认:cat /proc/sys/fs/file-max ≥ 2097152,cat /proc/sys/fs/nr_open ≥ 65535 —— 否则即使配置全对,也达不到预期。
Java、Node.js 等应用启动后仍受限?注意启动方式
很多应用通过脚本、supervisor、或 systemd 的 ExecStart 直接调用二进制,但环境继承不完整:
- Java 启动脚本里用
ulimit -n 65535是无效的:子 shell 的 ulimit 不传给 JVM 进程 - Node.js 若用
systemd启动,必须走LimitNOFILE,不能依赖 shell 脚本里的ulimit - Supervisor 用户需在
[program:xxx]段落中显式加ulimit=65535(取决于 supervisor 版本支持) - 最稳妥做法:所有长期运行服务,一律以 systemd 管理,并在对应 unit 或
system.conf中设LimitNOFILE
真正容易被忽略的是 nr_open 和 file-max 的协同关系——它们不像 limits.conf 那样“改了就能看到效果”,而是在后台静默兜底,出问题时连错误提示都不会给你。










