当前shell的文件描述符限制用ulimit -n(软限)、-hn(硬限)、-sn(软限)查看,但仅对当前会话有效;进程真实限制须查/proc/[pid]/limits;系统总上限看/proc/sys/fs/file-max;当前使用量看/proc/sys/fs/file-nr第一列。

看当前 shell 的软硬限制用 ulimit -n、ulimit -Hn、ulimit -Sn
这三个命令直接告诉你当前终端会话能打开多少文件: ulimit -n 显示软限制(实际生效值),ulimit -Hn 是硬限制(上限,普通用户不能突破),ulimit -Sn 单独看软限更明确。注意:这个值只对当前 shell 及其子进程有效,systemd 服务完全不继承它。
查具体进程的真实限制必须读 /proc/[pid]/limits
别信配置文件或 ulimit 输出,/proc/[pid]/limits 才是进程运行时的最终依据。执行 cat /proc/1234/limits | grep "Max open files"(把 1234 换成目标 PID),输出形如 Max open files 65536 65536 files,左边是软限,右边是硬限。如果看到 1024/4096,说明服务没真正加载你改过的 LimitNOFILE 或 limits.conf。
查系统总上限别用 sysctl fs.file-max,直接读 /proc/sys/fs/file-max
/proc/sys/fs/file-max 是内核当前运行值,最权威;sysctl fs.file-max 在某些发行版(如 RHEL 8+)可能返回缓存值,不一定实时。执行 cat /proc/sys/fs/file-max 得到的数字,就是全系统所有进程加起来最多能分配的 FD 总数。如果这个值低于 200000,中高并发服务容易因总量耗尽而报错,调单个进程的 limit 没用。
查系统当前用了多少 FD 要盯 /proc/sys/fs/file-nr 的第一列
cat /proc/sys/fs/file-nr 输出三列,例如 12480 0 2097152。第一列(12480)是已分配的 FD 总数,第二列(0)基本恒为 0,第三列(2097152)等于 file-max。真正要警惕的是第一列是否持续接近第三列——差值小于 5% 就该排查泄漏了。别用 lsof | wc -l,权限不足时会漏统计,且包含无效条目。
/proc/[pid]/limits 里,而不是你编辑过的任何配置文件。改完 limits.conf 或 systemd unit 文件后,不重启服务、不重载 daemon、不验证 PID 对应的 limits,等于没改。











