![在 XFS 和 ext4 中使用 xattr 存储许多小文件](https://linux22.com/image/611310/%E5%9C%A8%20XFS%20%E5%92%8C%20ext4%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20xattr%20%E5%AD%98%E5%82%A8%E8%AE%B8%E5%A4%9A%E5%B0%8F%E6%96%87%E4%BB%B6.png)
我在 XFS 驱动器上有许多带有 xattr 的小文件(2000 万个)。文件的平均大小约为 20KB,xattr 的平均大小约为 512 字节。
因为我想将它们移动到 ext4,所以我测试将这些文件的一部分复制到 ext4(inode 大小为 512 和 1024)和 XFS 驱动器中。
我分别使用以下选项格式化了 3 个驱动器:
# mkfs.ext4 -i 8192 -I 512 /dev/sde1
# mkfs.ext4 -i 8192 -I 1024 /dev/sdf1
# mkfs.xfs -f -i size=1024 /dev/sdg1
并通过 cp -r --preserve=mode,ownership,timestamps,xattr 复制了大约 30GB 的小文件
结果如下:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sde1 133654640 37164884 89360916 30% /srv/node/sde1 # ext4 -I 512
/dev/sdf1 124741744 36645652 80967252 32% /srv/node/sdf1 # ext4 -I 1024
/dev/sdg1 142507224 31020968 111486256 22% /srv/node/sdg1 # XFS
在这两种情况下,ext4 使用的块都比 XFS 多得多。是什么造成了这些差异?如何使用 ext4 而不浪费磁盘空间?
答案1
有一点是,XFS 在数百万个小文件上表现不佳。XFS 不是基于 inode 的 FS。由于您有大量小文件,因此块大小会有所不同,ext4 在数据块组中还保存间接块映射、范围树块和扩展属性、inode 列表等,这些会增加相同数量文件的总块大小。日志记录也需要一些时间。对于 ext4,您可以根据需要删除日志记录,但恢复 fs 的时间会显著增加,您也可以使用 -m 选项为超级用户分配较少的 %(默认值为 5%),您可以增加 1%。