查系统级总上限应直接读/proc/sys/fs/file-max,该值为内核实时运行的全局最大文件描述符总数;查当前已用数需盯/proc/sys/fs/file-nr第二列,即活跃占用数;查单个进程真实限制应看/proc/[pid]/limits而非ulimit -n。

查系统级总上限:直接读 /proc/sys/fs/file-max
这是最权威、无需权限的方式,返回值就是内核允许的全局最大文件描述符总数。运行:cat /proc/sys/fs/file-max,输出如 2097152,代表整个系统所有进程加起来最多能打开这么多句柄。
注意:file-max 不是当前已用数,也不是某个进程的限制——它只管总量。如果服务扛不住高并发(比如 Node.js 网关、Redis 集群),先看这个值是否够用,别一上来就调单个进程的 ulimit。
查单个进程的真实软硬限制:看 /proc/[pid]/limits
这才是准确反映该进程实际生效限制的地方,ulimit -n 只反映启动它的 shell 的设置,对 systemd 服务等基本无效。
cat /proc/1234/limits | grep "Max open files" 输出类似:Max open files 1024 4096 files,左边是 soft limit(进程可自行降低或 root 提升),右边是 hard limit(仅 root 可改)。
- systemd 启动的服务,这个值来自服务单元里的
LimitNOFILE=,不是/etc/security/limits.conf - 软硬限不一致时,进程默认按 soft limit 运行;想临时提,得在启动前用
ulimit -n 65536,运行中写/proc/1234/limits会报Operation not permitted
查当前已用句柄总数:盯紧 /proc/sys/fs/file-nr 第二列
cat /proc/sys/fs/file-nr 输出三列,例如:12480 3210 2097152。
真正要监控的是第二列(3210)——它表示当前被进程真正占用的句柄数,也就是“活跃使用中”的数量。第一列是已分配总数(含未用),第三列等于 file-max。
别用 lsof | wc -l 替代:权限失败会中断统计,还混入表头和空行;lsof -i 更糟,只扫网络 socket,漏掉 eventfd、timerfd、普通文件等大量非网络句柄。
查某进程当前打开了多少句柄:数 /proc/[pid]/fd/ 目录链接数
Linux 中每个打开的句柄都在 /proc/[pid]/fd/ 下对应一个符号链接,所以最准、最快的方法就是统计它:
ls -1 /proc/1234/fd/ 2>/dev/null | wc -l
这个命令比 lsof -p 1234 | wc -l 更稳定,尤其在高并发或权限受限场景下不会漏数。注意:普通用户只能读自己进程的 /proc/[pid]/fd/,查其他进程需 root 权限。
如果只想快速找“句柄大户”,用:lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -10,第一列是句柄数,第二列是 PID。











