查找每个进程的打开文件限制:
ulimit -n
按所有进程计数所有打开的文件:
lsof | wc -l
获取允许的最大打开文件数:
cat /proc/sys/fs/file-max
我的问题是:为什么Linux中打开文件有限制?
#1 楼
原因是操作系统需要内存来管理每个打开的文件,并且内存是有限的资源-尤其是在嵌入式系统上。作为root用户,您可以更改每个进程(通过
ulimit -n
)和每个系统(例如echo 800000 > /proc/sys/fs/file-max
)的打开文件数的最大值。评论
还有一个安全原因:如果没有限制,那么在服务器关闭之前,userland软件将能够无休止地创建文件。
– Coren
2012年4月19日在14:44
@Coren这里讨论的限制仅适用于打开文件处理程序的数量。由于程序还可以关闭文件处理程序,因此它可以创建任意数量的文件,并可以创建所需的大小,直到所有可用磁盘空间都满为止。为防止这种情况,可以使用磁盘配额或单独的分区。从某种意义上讲,您是对的,安全性的一个方面是防止资源耗尽-为此,存在一些限制。
– jofel
2012年4月19日在15:23
@jofel谢谢。我猜打开的文件句柄由结构文件的实例表示,并且此结构的大小很小(字节级别),因此只要内存不存在,我可以将/.../file-max设置为一个很大的值用完了?
– xanpeng
2012年4月19日在16:12
@xanpeng我不是内核专家,但是据我所知,file-max的默认值似乎是RAM大小除以10k。由于每个文件处理程序使用的实际内存应该小得多(结构文件的大小加上一些驱动程序相关的内存),因此这似乎是一个相当保守的限制。
– jofel
2012年4月19日在16:43
您可以将其设置为2 ^ 63-1的最大值:echo 9223372036854775807> / proc / sys / fs / file-max。不知道为什么Linux使用带符号整数。
–杰克·吉芬(Jack Giffin)
20年7月9日在20:14
#2 楼
请注意,lsof | wc -l
总结了很多重复的条目(分支的进程可以共享文件句柄等)。该数字可能远高于/proc/sys/fs/file-max
中设置的限制。 要从Linux内核的角度获取当前打开的文件数,请执行以下操作:
cat /proc/sys/fs/file-nr
示例:该服务器具有40096在最多65536个打开的文件中,尽管lsof报告的数字更大:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
评论
由于lsof将报告许多文件两次或更多次,例如/ dev / null,因此您可以尝试以下最佳猜测:lsof | awk'{print $ 9}'| sort | uniq | wc -l
–伊万
18年8月8日在7:27
您可以使用lsof | awk'!a [$ NF] ++ {c ++} END {print c}'来获取打开文件的非重复计数。
– P ....
19年5月28日在18:04
非常老的问题,但是我希望在服务器和lsof中查看这些设置| wc -l给出40,000,而file-nr说2300-这种差异正常吗?
–a.smith
20 Sep 15 '13:00
#3 楼
我认为这主要是出于历史原因。Unix文件描述符是一个很小的
int
值,由open
和creat
之类的函数返回,并传递给read
,write
和close
等。至少在Unix的早期版本中,文件描述符只是对固定大小的每个进程结构数组的索引,其中每个结构都包含有关打开文件的信息。如果我没记错的话,一些早期的系统将这张表的大小限制为20左右。
更多的现代系统具有更高的限制,但在很大程度上出于惯性而保留了相同的通用方案。
评论
Solaris语言对C语言FILE数据结构的限制为20。文件句柄数始终较大。
–乐透
2014年9月14日下午3:29
@Lothar:有趣。我不知道为什么限额会有所不同。鉴于fileno和fdopen函数,我希望它们几乎可以互换。
–基思·汤普森(Keith Thompson)
2014年9月14日下午3:37
Unix文件不仅仅是返回的文件句柄(int)。有磁盘缓冲区和定义当前文件偏移量,文件所有者,权限,inode等的文件控制块。
– ChuckCottrill
17年11月22日在6:29
@ChuckCottrill:是的,当然。但是无论是通过int描述符还是通过FILE *访问文件,大多数信息都必须存储。如果通过open()打开的文件超过20个,fdopen()会失败吗?
–基思·汤普森(Keith Thompson)
17年11月22日在17:14
评论
@Rob用Google搜索了一下,发现它是一个叉子炸弹,可以用来解释打开文件的限制吗?嗯,进程限制和文件限制很重要,因此分叉炸弹之类的事情不会破坏所有用户的服务器/计算机,而不会破坏所有用户,并且只是暂时的。否则,共享服务器上的某人可能会掀起一个前哨炸弹,并完全击倒所有用户,而不仅仅是他们自己。
好人总结了一些非常有用的命令! :+1:
@ Rob,fork炸弹与它没有任何关系,因为文件限制是每个进程的,并且每次您进行fork时,它都不会打开新的文件句柄。