VFS:达到文件最大限制1231582

我正在运行一个Linux 2.6.36内核,我看到一些随机错误。 像

ls: error while loading shared libraries: libpthread.so.0: cannot open shared object file: Error 23 

是的,我的系统无法持续运行'ls'命令。 🙁

我注意到我的dmesg输出中的几个错误:

 # dmesg | tail [2808967.543203] EXT4-fs (sda3): re-mounted. Opts: (null) [2837776.220605] xv[14450] general protection ip:7f20c20c6ac6 sp:7fff3641b368 error:0 in libpng14.so.14.4.0[7f20c20a9000+29000] [4931344.685302] EXT4-fs (md16): re-mounted. Opts: (null) [4982666.631444] VFS: file-max limit 1231582 reached [4982666.764240] VFS: file-max limit 1231582 reached [4982767.360574] VFS: file-max limit 1231582 reached [4982901.904628] VFS: file-max limit 1231582 reached [4982964.930556] VFS: file-max limit 1231582 reached [4982966.352170] VFS: file-max limit 1231582 reached [4982966.649195] top[31095]: segfault at 14 ip 00007fd6ace42700 sp 00007fff20746530 error 6 in libproc-3.2.8.so[7fd6ace3b000+e000] 

显然,文件最大错误看起来可疑,被聚集在一起,最近。

 # cat /proc/sys/fs/file-max 1231582 # cat /proc/sys/fs/file-nr 1231712 0 1231582 

这对我来说也有点奇怪,但事实是,我没有办法在这个系统上打开120万个文件。 我是唯一使用它的人,而且本地networking之外的任何人都看不到它。

 # lsof | wc 16046 148253 1882901 # ps -ef | wc 574 6104 44260 

我看到一些文件说:

文件最大和文件编号:

内核dynamic地分配文件句柄,但是现在它不会再释放它们。

file-max中的值表示Linux内核将分配的最大文件句柄数。 当您收到很多有关用完文件句柄的错误消息时,可能需要增加此限制。

历史上,file-nr中的三个值表示分配的文件句柄的数量,已分配但未使用的文件句柄的数量以及文件句柄的最大数量。 Linux 2.6总是报告0作为自由文件句柄的数量 – 这不是一个错误,它只是意味着分配文件句柄的数量与使用的文件句柄的数量完全一致。

试图分配比file-max更多的文件描述符,用printk报告,查找“VFS:达到文件最大限制”。

我第一次读到这个内核基本上有一个内置的文件描述符泄漏,但我觉得很难相信。 这意味着任何需要重新启动的系统才能释放文件描述符。 正如我所说的,我不能相信这是真的,因为我一直都希望Linux系统一直保持好几个月(甚至几年)。 另一方面,我也不敢相信我的近乎空闲的系统已经打开了超过一百万个文件。

有没有人有任何想法,要么修复或进一步诊断? 当然,我可以重新启动系统,但是我不希望这个问题每隔几周就会出现一次。 作为一个权宜之计,我已经退出了火狐浏览器,即使我只打开了一个窗口,它占了将近2000行lsof输出(!),现在我可以再次运行'ls'了,但是我怀疑这会修复问题很长。 (编辑:哎呀,说话太快了,当我输完这个问题的时候,症状已经回来了)

在此先感谢您的帮助。

我讨厌留下一个问题,所以任何人发现这一点总结。

我结束了重新发布在serverfault的问题,而不是(本文)

实际上,他们无法做出任何事情,但我做了一些调查,最终发现这是NFSv4的一个真正的bug,特别是服务器端的锁定代码。 我有一个每5秒钟运行一次监控脚本的NFS客户端,使用rrdtool将一些数据记录到一个NFS挂载的文件中。 每次运行时,都会锁定文件进行写入,并分配服务器(但错误地不会释放)打开的文件描述符。 该脚本(加上另一个运行得不那么频繁)导致每小时消耗大约900个打开的文件,两个月后达到极限。

有几种解决方案是可能的:1)改用NFSv3。 2)停止运行监控脚本。 3)将监控结果存储在本地而不是NFS上。 4)等待补丁NFSv4修复这(布鲁斯领域实际上给我一个补丁尝试,但我没有时间)

我相信你可以想到其他可能的解决方案。

感谢您的尝试。