ext4 上的碎片目录?

ext4 上的碎片目录?

我的 ext4 文件系统在增大时会丧失性能。

我有一个存储大量图像文件的系统。这个基于 Debian 的图像服务器将图像文件按年文件夹划分存储在具有硬件 RAID-1 的 1-2TB 磁盘组上。文件存储在年文件夹结构中,下面有两层 256 个文件夹。

喜欢

images/2021/2b/0f/193528211006081503835.tif

这些文件是在一年内连续写入的,并通过哈希值均匀分布,因此每个叶/图像文件夹在年底包含大约 400 个文件。

这样,每个文件夹总共就有大约 256 x 256 x 400 = 26 214 400 个文件。

迭代此文件夹结构直到大约 2000 万个文件时效果很好。可能需要几个小时。当文件越来越大时,即使列出一个包含 300-400 个文件的叶文件夹,如果不在缓存中,也需要 1-4 秒。我怀疑这与目录条目中的碎片有关。

当您知道路径时,访问单个文件总是很快。而且这不是硬件/磁盘问题,原始 io 性能很好。顺便说一句,文件永远不会从此结构中删除。

使用 e4defrag 进行碎片整理没什么区别。我猜它只对文件进行碎片整理,而不是对目录进行碎片整理。fsck.ext4 -D 可能是一个解决方案,但由于这是一个生产系统,我不太愿意卸载文件系统并尝试。

有帮助的是将文件复制到临时文件夹,然后将其移回并覆盖原始文件。例如

cp -a images/2021/2b/0f/* images/2021/2b/tmp
mv -f images/2021/2b/tmp/* images/2021/2b/0f

执行此操作后,性能恢复(即使不在缓存中)。如果文件本身有碎片,我明白为什么这会有所帮助,但根据 e4defrag 的说法,情况并非如此。将文件移动到临时文件夹并移回也无济于事。

有人可以帮我了解这里发生了什么吗?

答案1

我会尝试回答 ext4 的问题。如何创建文件系统?例如,输出是什么:

sudo tune2fs -l /dev/sda1

我假设您的 ext4 卷是 sda1。文件系统功能中应该有“dir_index”、“filetype”。如果没有,您必须在启用这些功能的情况下进行格式化。当这些都正常时,您可能希望用文件缓存换取元数据缓存。如果输出:

cat /proc/sys/vm/vfs_cache_pressure

显示 100,尝试将其降低到 50。它可以持久保存在文件中etc/sysctl.conf ,您可以在其中写入:

vm.vfs_cache_pressure=50

并通过以下方式应用它:sudo sysctl -p这将增加缓存元数据的概率。Ext4 目录索引可能会像您建议的那样碎片化。没有直接的解决方法,但您可以查看此 Stackexchange 帖子:如何自动对 ext4 目录进行碎片整理

相关内容