ulimit -a显示当前shell所有软限制,ulimit -sn/-hn查文件数软硬限,/proc/$pid/limits看进程真实限制,/etc/security/limits.conf配持久化规则,/proc/sys/fs/file-max查系统级天花板。

直接看 ulimit -a 能拿到当前 shell 的全部软限制,但“具体配额”往往不止这一层——它可能来自 PAM 配置、内核参数、甚至进程启动时继承的父进程限制。不查全三层,容易误判。
查当前 shell 会话的实时限制用 ulimit
这是最快速的第一步,反映的是你当前终端里新起进程的实际软限制:
-
ulimit -a:列出所有资源软限制(如open files (-n)、max user processes (-u)) -
ulimit -Hn和ulimit -Sn:分别查打开文件数的硬/软限制,用于确认是否被调高过 - 注意:
unlimited不代表真没上限,只是软限制未设;硬限制或系统级参数仍可能卡死
查目标进程实际生效的限制用 /proc/$pid/limits
很多服务(比如 nginx、redis)是 systemd 启动的,它的限制不等于你终端里的 ulimit,得看真实运行时的值:
- 先用
ps aux | grep nginx找到 PID,比如是1234 - 执行
cat /proc/1234/limits,重点关注Max open files和Max processes行 - 输出里
Soft Limit和Hard Limit是真正约束该进程的数值,比ulimit更权威 - 如果看到
1024却以为改过了,大概率是服务没重载或没用新 limits.conf 生效
查持久化配置是否写对了 /etc/security/limits.conf
这里写的规则不会自动生效,且格式错一个空格就失效:
- 检查是否存在形如
username soft nofile 65536和username hard nofile 65536的行 - 注意:用户名必须精确匹配,通配符
*仅对普通用户生效,root 需单独写root - 改完后必须重新登录(不是新开 terminal),或用
loginctl terminate-user $USER强制重载 PAM 会话 - systemd 服务默认绕过 limits.conf,需在 service 文件里加
LimitNOFILE=65536才行
查系统级天花板是否拖后腿 /proc/sys/fs/file-max
即使你把用户限制设到 100 万,fs.file-max 只有 80 万,那还是卡在 80 万:
-
cat /proc/sys/fs/file-max:全系统允许的最大文件句柄总数 -
cat /proc/sys/fs/file-nr:三个数字,中间那个是已分配未释放的句柄数,接近第一个值就危险 - 临时调高:
sudo sysctl -w fs.file-max=2097152 - 永久生效:往
/etc/sysctl.conf加fs.file-max = 2097152,再sudo sysctl -p
最容易被忽略的是:systemd 服务、容器内进程、SSH 登录和图形界面登录走的 PAM 路径不同,limits.conf 规则可能只对其中一种生效。验证前先确认你是以什么方式启动目标进程的。











