现在,我知道如何:


查找每个进程的打开文件限制:ulimit -n

按所有进程计数所有打开的文件:lsof | wc -l

获取允许的最大打开文件数:cat /proc/sys/fs/file-max


我的问题是:为什么Linux中打开文件有限制?

评论

@Rob用Google搜索了一下,发现它是一个叉子炸弹,可以用来解释打开文件的限制吗?

嗯,进程限制和文件限制很重要,因此分叉炸弹之类的事情不会破坏所有用户的服务器/计算机,而不会破坏所有用户,并且只是暂时的。否则,共享服务器上的某人可能会掀起一个前哨炸弹,并完全击倒所有用户,而不仅仅是他们自己。

好人总结了一些非常有用的命令! :+1:

@ Rob,fork炸弹与它没有任何关系,因为文件限制是每个进程的,并且每次您进行fork时,它都不会打开新的文件句柄。

#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值,由opencreat之类的函数返回,并传递给readwriteclose等。

至少在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