当前系统的 file-max 值可通过 cat /proc/sys/fs/file-max 查看,该值表示系统全局能打开的最大文件数,是内核级硬上限,重启后恢复默认。

怎么查当前系统的 file-max 值
Linux 系统全局能打开的最大文件数由内核参数 file-max 控制,不是看 ulimit,也不是看进程限制,而是整个系统级硬上限。
直接读取 /proc/sys/fs/file-max 最可靠:
cat /proc/sys/fs/file-max
这个值是运行时生效的,重启后恢复为内核默认(通常跟内存有关)。别去翻 /etc/sysctl.conf 里有没有这行——没配过的话,它根本不会出现在那里面。
file-max 和 ulimit -n 的关系搞反就踩坑
很多人看到某个进程报 Too many open files,第一反应是调大 ulimit -n,但其实卡在 file-max 上时,调单个进程也没用。
-
ulimit -n是单个进程能打开的文件描述符上限(软限/硬限),受file-max总量约束 - 所有进程的文件描述符加起来不能超过
file-max,哪怕每个进程都只开 1024,1000 个进程就可能触顶 -
file-max不足时,dmesg里会出现类似VFS: file-max limit reached的提示
临时改和永久改 file-max 的区别
临时改就是写进 /proc,立刻生效但重启丢:
echo 2097152 > /proc/sys/fs/file-max
永久改要进 sysctl 配置,注意两个关键点:
- 写到
/etc/sysctl.conf或/etc/sysctl.d/*.conf里,格式是fs.file-max = 2097152 - 必须运行
sysctl -p才加载,光改文件不生效 - 某些发行版(如新版 Ubuntu)用
systemd-sysctl管理,改完还得systemctl restart systemd-sysctl
怎么判断是不是真到了 file-max 瓶颈
别猜,看三个数字:
- 当前已分配的文件句柄数:
cat /proc/sys/fs/file-nr—— 输出三个数,第一个是已用,第二个是未用但已分配的,第三个才是file-max - 已用数接近第三个数,就是快满了
- 观察
/proc/sys/fs/inode-nr和file-nr是否同步飙高,有时候 inode 耗尽也会伪装成文件数不足 - 长期跑服务的机器,建议把
file-max设为内存 MB 数 × 10 左右(比如 64G 内存 → 640000),太小容易半夜崩
改完别忘了验证:重启后 cat /proc/sys/fs/file-max 还是不是你设的值。很多运维漏掉 sysctl -p 或服务没 reload,以为改了其实没生效。










