为什么 Linux 发行版不默认挂载具有无限 inode 的 tmpfs?

为什么 Linux 发行版不默认挂载具有无限 inode 的 tmpfs?

根据这个答案至少可以挂载具有“无限”inode 的 tmpfs。

考虑这个特定的情况(选择的数字是为了举例,我知道它们并不现实):

  • tmpfs 分区的卷使用率为 50%
  • 其中 90% 的数据是 inode(即 45% 的磁盘空间由 inode 使用,5% 由“真实”数据使用)
  • tmpfs 已安装nr_inodes=1000
  • 所有 1000 个 inode 都被当前写入的 inode 占用

这意味着 tmpfs 已占用 50%,但是任何对其进行写入的尝试都将导致空间不足错误。

在我看来,设置nr_inodes=0(又称无限 inode)会使这种情况消失。

  • 无限 inode 不是默认的,有什么原因吗?
  • 有什么理由限制文件系统上的 inode 数量?

答案1

通常(例如:,,,ext2),文件系统可容纳的 inode 数量是在创建时设置的,因此没有挂载选项可以解决它。ext3ext4ufs

某些文件系统xfs的 inode 使用的空间比率是可调的,因此可以随时增加。

现代文件系统对文件系统可存储的文件数量没有硬编码限制,inode(或其等效物)是根据需要创建的ZFSbtrfs


编辑:缩小更新后问题的答案范围。

使用tmpfs,默认的 inode 数量经过计算足以满足大多数实际使用情况。此设置不理想的唯一情况是如果在 上创建了大量空文件tmpfs。如果您处于这种情况,最佳做法是将参数调整nr_inodes为足够大的值,以便所有文件都适合但不使用0(=无限制)。tmpfs 文档指出这不应该是默认设置,因为非 root 用户可能会耗尽内存:

if nr_inodes=0, inodes will not be limited.  It is generally unwise to
mount with such options, since it allows any user with write access to
use up all the memory on the machine; but enhances the scalability of
that instance in a system with many cpus making intensive use of it.

tmpfs然而,由于RAM 使用率默认限制为 50%,因此尚不清楚如何发生这种情况:

size:      The limit of allocated bytes for this tmpfs instance. The 
           default is half of your physical RAM without swap. If you
           oversize your tmpfs instances the machine will deadlock
           since the OOM handler will not be able to free that memory.

许多人会更加关心默认内存量是否与他们的应用程序需求相匹配。

答案2

就像 Madhatter 所说的那样,inodes 占用了一些空间,当谈到使用无限数量的 inode 时,这个数字并不是一个小数目。

答案3

tmpfs inode 的内存消耗不计入挂载的分配块。不能有 tmpfs 用法“90% 的 inode”,只计算“真实”数据。

只要 tmpfs 挂载文件不包含任何字节,其大小的任何挂载都会继续显示为“空”。维护挂载的总内存消耗可能会大大超过任何大小限制。

$ find /mnt | wc -l
60000
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
tmpfs      4.0K    0  4.0K   0% /mnt

因此,为了防止内存耗尽,两个都 size=并且nr_inodes=必须加以限制。如果默认设置了非常大的 inode 限制或没有设置,失控进程可能会使系统停滞,并且无法轻易确定问题的根源。

相关内容