现在,我知道如何:
- 查找每个进程的打开文件限制:
ulimit -n
- 统计所有进程打开的文件数:
lsof | wc -l
- 获取允许的最大打开文件数:
cat /proc/sys/fs/file-max
我的问题是:为什么Linux中有打开文件的限制?
答案1
原因是操作系统需要内存来管理每个打开的文件,而内存是有限的资源 - 特别是在嵌入式系统上。
ulimit -n
作为 root 用户,您可以更改每个进程(通过)和每个系统(例如)的最大打开文件数echo 800000 > /proc/sys/fs/file-max
。
答案2
请注意,lsof | wc -l
总结了很多重复的条目(分叉进程可以共享文件句柄等)。该数字可能远高于 中设定的限制/proc/sys/fs/file-max
。
要从 Linux 内核的角度获取当前打开的文件数,请执行以下操作:
cat /proc/sys/fs/file-nr
示例:该服务器最多有 65536 个打开文件,其中有 40096 个,尽管 lsof 报告的数字要大得多:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
答案3
我认为这主要是出于历史原因。
Unix 文件描述符是一个小值,由和int
等函数返回,并传递给、、等。open
creat
read
write
close
至少在 Unix 的早期版本中,文件描述符只是固定大小的每进程结构数组的索引,其中每个结构都包含有关打开文件的信息。如果我没记错的话,一些早期的系统将该表的大小限制为 20 左右。
更现代的系统有更高的限制,但保留了相同的总体方案,很大程度上是出于惯性。