为什么在 Linux 中限制打开文件的数量?

xan*_*eng 158 limit open-files

现在,我知道如何:

  • 查找每个进程的打开文件限制: ulimit -n
  • 计算所有进程打开的所有文件: lsof | wc -l
  • 获取允许的最大打开文件数: cat /proc/sys/fs/file-max

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

jof*_*fel 97

原因是操作系统需要内存来管理每个打开的文件,而内存是一种有限的资源——尤其是在嵌入式系统上。

作为 root 用户,您可以更改每个进程(通过ulimit -n)和每个系统(例如echo 800000 > /proc/sys/fs/file-max)的最大打开文件数。

  • 还有一个安全原因:如果没有限制,用户级软件将能够无休止地创建文件,直到服务器宕机。 (24认同)
  • @Coren 此处讨论的限制仅适用于打开文件处理程序的数量。由于程序还可以关闭文件处理程序,因此它可以创建任意数量和大小的文件,直到所有可用磁盘空间已满。为了防止这种情况,您可以使用磁盘配额或分​​隔分区。从某种意义上说,您是真实的,安全的一个方面是防止资源耗尽 - 对此有限制。 (19认同)
  • @xanpeng 我不是内核专家,但据我所知,`file-max` 的默认值似乎是 RAM 大小除以 10k。由于每个文件处理程序使用的实际内存应该小得多(`struct file` 的大小加上一些驱动程序相关内存),这似乎是一个相当保守的限制。 (7认同)
  • 您可以将其设置为 2^63-1 的最大值:`echo 9223372036854775807 > /proc/sys/fs/file-max`。不知道为什么 Linux 使用有符号整数。 (2认同)

gre*_*eke 79

请注意,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
Run Code Online (Sandbox Code Playgroud)

  • 由于 `lsof` 会报告许多文件两次或多次,例如 `/dev/null`,您可以尝试使用以下命令进行最佳猜测:`lsof|awk '{print $9}'|sort|uniq|wc -l` (2认同)

Kei*_*son 21

我认为这主要是出于历史原因。

Unix 文件描述符是一个小int值,由open和等函数返回creat,并传递给readwriteclose等。

至少在 Unix 的早期版本中,文件描述符只是一个固定大小的每进程结构数组的索引,其中每个结构都包含有关打开文件的信息。如果我没记错的话,一些早期的系统将这个表的大小限制在 20 左右。

更现代的系统有更高的限制,但保持了相同的总体方案,主要是出于惯性。