创建具有 2^32-1 个 inode 的 ext4 文件系统有什么缺点吗?
我有一个 1TB 的驱动器,我想在上面存储 8 亿到 15 亿个小文件。看来最大值是 40 亿,所以我想知道我是否可以在创建 fs 时将其设置为最大值,或者我应该找到其他解决方案。
答案1
根据类似的问题堆栈溢出 和Unix 和 Linux(见下文)在 ext4 文件系统上将 inode 数量最大化并不是一个好主意。
最好使用其他文件系统或将磁盘分成多个文件系统。
总结一下:
一个 inode 占用 256 个字节。可以将其配置为 128 个,但即使:
2³² inodes × 256 bytes each = 1 TB
创建 ext4 文件系统时,您可以指定使用类型 定义如下
/etc/mke2fs.conf
:mkfs.ext4 -T usage-type /dev/something
small
为了存储许多小文件,可能使用以下类型:small = { blocksize = 1024 inode_size = 128 inode_ratio = 4096 }
这意味着:每 4096 字节的磁盘空间(文件系统大小)将保留一个 inode,每个 inode 的大小为 128 字节。
mkfs.ext4 -T small /dev/something
因此,该命令将在 1TB 文件系统上创建 2.44 亿个 inode,占用 31 GB。这 2.44 亿个文件将至少占用 250 GB(每个文件至少 1024 字节)。要用较小的占用空间(128 字节)来保存 10 亿个 inode,仅 inode 就需要 128 GB。如果使用最小可能的块大小(根据 mk2efs 的手册页,为 1024),那么这 10 亿个文件至少会占用 1TB(但请记住,由于 inode 占用了 128 GB,因此只剩下 872 GB)。
ext4 的最小块大小为 1024 字节。因此,您无法存储超过 1 TB / 1024 = 10 亿个文件,并且拥有更多 inode 毫无意义。
一般来说,
inode_ratio
不应该小于,blocksize
因为您不能(轻易地)在一个块中存储多个文件。如果文件系统配置成这样,可以将文件的前 60 个字节直接存储在 inode 中。在这种情况下,文件不会占用(常规)块;阅读此类信息此处内联数据但也要考虑索引节点大小。
从评论到U&L 问题:
太多的 inode 肯定会带来很大的成本,它们本身就占用空间,相信我,fsck 的性能非常糟糕。我们谈论的是指数级的减速,比如 30 秒 vs 2 天……这是 I/O 限制。更不用说文件列表、索引等的减速了。
参考: