软硬限制必须分层设置,只改ulimit -n或limits.conf会失效:systemd服务不读limits.conf,非登录shell不触发PAM,硬限制还受内核nr_open约束;ulimit -Sn是实际可用值,-Hn是其上限,普通用户只能调高Sn(≤Hn),root才能调高Hn;设Sn前须确保Hn≥目标值,否则静默失败;limits.conf依赖PAM登录流程,需确认/etc/pam.d/中含session required pam_limits.so,且必须重新登录生效;systemd服务须用systemctl edit创建override.conf写LimitNOFILE=65535,并执行daemon-reload与restart;若ulimit -Hn未达预期,需检查/proc/sys/fs/nr_open是否足够,否则需调大该内核参数。

软硬限制必须分层设置,只改 ulimit -n 或只写 limits.conf 都会失效——因为 systemd 服务不读它,非登录 shell 不触发 PAM,而硬限制还受内核 nr_open 约束。
ulimit -Sn 和 ulimit -Hn 的区别与实操边界
软限制(ulimit -Sn)是进程实际能用的值;硬限制(ulimit -Hn)是软限制能设的上限。普通用户只能调低硬限制或提升软限制(但不能超硬限),root 才能提硬限。
- 执行
ulimit -Sn 65535前,先确认ulimit -Hn≥ 65535,否则命令静默失败 - 若
ulimit -Hn显示 4096,说明硬限被卡住,不是limits.conf没生效,就是nr_open太小 - 临时调高后,已运行的进程不受影响,必须重启服务进程才能用上新值
/etc/security/limits.conf 生效的三个硬条件
这个文件不是“写了就生效”,它依赖 PAM 登录流程加载,且只对通过 login、ssh、su - 这类完整会话启动的进程起作用。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 必须确保
/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/sshd(SSH 场景)里有这行:session required pam_limits.so - 配置格式严格:
www-data soft nofile 65535中的nofile不能写成open files或漏空格 - 改完必须退出当前终端、重新 SSH 登录(不能用
su www-data切换,它不走 PAM session 流程)
systemd 服务绕过 limits.conf 的强制解法
nginx、redis、java 应用等由 systemd 托管的服务,默认完全无视 /etc/security/limits.conf,必须显式声明。
- 不要编辑原始 unit 文件(会被包管理器覆盖),用
sudo systemctl edit nginx.service创建覆盖配置 - 覆盖内容必须是:
[Service] LimitNOFILE=65535
——注意是LimitNOFILE,不是LimitNOFILESoft或其他变体 - 改完必须执行
sudo systemctl daemon-reload && sudo systemctl restart nginx,仅restart不够 - 如果服务主进程以 root 启动、worker 降权为
www-data,LimitNOFILE仍要设在 unit 中,且值需满足 worker 实际需求
硬限制被 nr_open 截断的排查路径
即使你在 limits.conf 里写了 * hard nofile 1000000,登录后 ulimit -Hn 仍是 65536,大概率是内核单进程上限 nr_open 挡住了。
- 查真实天花板:
cat /proc/sys/fs/nr_open,常见值是 1048576,但某些旧发行版默认更低 - 若要设 hard limit > 当前
nr_open,必须先改内核参数:echo 'fs.nr_open = 2000000' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p -
limits.conf中的 hard 值绝不能超过新nr_open,否则整行配置静默失效,连日志都不报
最常被忽略的是:systemd 服务和容器化部署(如 Docker)根本不走 PAM 流程,limits.conf 对它们完全无效;而 nr_open 这个内核参数,很多人压根不知道它的存在,直到硬限制死活提不上去才卡住。

















