查系统级最大文件描述符数(file-max)应执行cat /proc/sys/fs/file-max或sysctl fs.file-max,该值代表内核允许分配的文件描述符总数,是实时生效的系统硬上限,与ulimit -n无关。

怎么查系统级最大文件描述符数(file-max)
系统能打开的文件总数由内核参数 fs.file-max 控制,这不是某个用户的限制,而是整个内核能分配的 fd 上限。它和进程级的 ulimit -n 完全无关。
查实时生效值,用这两个命令任一即可:
sysctl fs.file-maxcat /proc/sys/fs/file-max
注意:返回值通常是极大整数(如 9223372036854775807),说明内核没硬性封顶,但实际受限于内存和 nr_open;如果数值明显偏小(比如 100000),说明已被人工调低。
为什么 lsof | wc -l 不等于系统总打开数
lsof 默认列出所有进程打开的文件,但它会重复统计同一文件被多个进程打开的情况,且包含大量非文件类 fd(如 socket、eventfd、inotify),结果严重失真。
真正反映系统当前已用 fd 总量的是 /proc/sys/fs/file-nr 的第一列:
-
cat /proc/sys/fs/file-nr输出形如2560 0 9223372036854775807 - 第一个数字(
2560)= 已分配并正在使用的 fd 总数,这才是你要的“当前打开总数” - 第二个是已分配但空闲的 fd 缓存数,第三个就是
fs.file-max
systemd 服务里看到的 Max open files 是哪来的
用 cat /proc/[pid]/limits | grep "Max open files" 查某个 systemd 启动的进程时,软硬限制常显示为 1024 或 4096,哪怕你改过 /etc/security/limits.conf —— 因为 systemd 忽略那个配置。
真正起效的方式只有两种:
- 在 service unit 文件里加:
LimitNOFILE=65536(推荐,精确控制单服务) - 全局改 systemd 默认值:
DefaultLimitNOFILE=65536写进/etc/systemd/system.conf,再systemctl daemon-reload
漏掉 daemon-reload 或没重启服务,配置就白写。
别把 nr_open 和 file-max 搞混
nr_open 是单个进程能申请的 fd 上限(默认约 1048576),file-max 是全系统总量。如果要把 nofile 调到 100 万以上,必须先确认两者都够大:
cat /proc/sys/fs/nr_opencat /proc/sys/fs/file-max
若 nr_open 太小,ulimit -n 即使设得再高也会被截断;修改它需写入 /proc/sys/fs/nr_open(临时)或加 fs.nr_open=2097152 到 /etc/sysctl.conf(永久)。











