我有一个目录树,其中包含许多小文件和少量较大文件。文件的平均大小约为 1 KB。树中有210158个文件和目录(这个数字是通过运行获得的find | wc -l
)。
一小部分文件每周会被添加/删除/重写数次。这既适用于小文件,也适用于(少量)较大文件。
我尝试过的文件系统(ext4、btrfs)在磁盘上定位文件时存在一些问题。随着时间的推移,磁盘(旋转介质,而不是固态磁盘)上文件的物理位置分布变得更加随机。这种随机分布的负面后果是文件系统变得越来越慢(例如:比新文件系统慢 4 倍)。
是否有一种 Linux 文件系统(或一种文件系统维护方法)不会受到这种性能下降的影响,并且能够在旋转介质上保持稳定的性能配置文件?文件系统可以在 Fuse 上运行,但它需要可靠。
答案1
表现
我写了一个小基准(来源),找出哪种文件系统在处理数十万个小文件时表现最佳:
- 使用 /dev/urandom 中的数据创建 300000 个文件(512B 到 1536B)
- 重写30000个随机文件并改变大小
- 读取 30000 个连续文件
- 读取30000个随机文件
删除所有文件
每一步后同步并删除缓存
结果(平均时间以秒为单位,越低=越好):
Using Linux Kernel version 3.1.7
Btrfs:
create: 53 s
rewrite: 6 s
read sq: 4 s
read rn: 312 s
delete: 373 s
ext4:
create: 46 s
rewrite: 18 s
read sq: 29 s
read rn: 272 s
delete: 12 s
ReiserFS:
create: 62 s
rewrite: 321 s
read sq: 6 s
read rn: 246 s
delete: 41 s
XFS:
create: 68 s
rewrite: 430 s
read sq: 37 s
read rn: 367 s
delete: 36 s
结果:
虽然 Ext4 具有良好的整体性能,但 ReiserFS 在读取顺序文件方面速度极快。事实证明XFS 对于许多小文件来说很慢 - 您不应该将它用于此用例。
碎片化问题
防止文件系统在驱动器上分发文件的唯一方法是仅将分区保持在您真正需要的大小,但请注意不要将分区设置得太小,以防止文件内碎片。使用左心室容量非常有帮助。
进一步阅读
Arch Wiki 有一些关于文件系统性能的精彩文章:
https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types
https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices
答案2
目录中存在 1-200 万个文件后,ext4 性能就会下降。请参阅此页http://genomewiki.ucsc.edu/index.php/File_system_performance由 UCSC 的 Hiram Clawson 创建
答案3
我使用 ReiserFS 来完成这项任务,它是专门为处理大量小文件而设计的。有一个很容易阅读有关它的文字在 funtoo 维基。
ReiserFS 还具有许多专门旨在提高小文件性能的功能。与 ext2 不同,ReiserFS 不以固定的 1 k 或 4 k 块分配存储空间。相反,它可以分配所需的确切大小。
答案4
XFS 因在此类情况下表现出色而闻名。这就是我们在工作中将其用于邮件存储(1 个目录中可以包含数十万个文件)的部分原因。它比 ReiserFS 具有更好的容错能力,用途更广泛,并且通常是一个非常成熟的文件系统。
此外,XFS 支持在线碎片整理。尽管它确实使用了延迟分配技术,但它首先会减少碎片(与其他文件系统相比)。