Linux:读取文件需要多少磁盘 I/O?如何最小化?

Con*_*ion 5 linux performance filesystems hard-drive

根据Facebook 的 Haystack 上的这篇论文

"由于 NAS 设备管理目录元数据的方式,将数千个文件放置在一个目录中的效率极低,因为目录的块图太大而无法被设备有效缓存。因此,通常会发生 10 次以上的磁盘操作检索单个图像。将目录大小减少到每个目录数百个图像后,生成的系统通常仍会产生 3 个磁盘操作来获取图像:一个将目录元数据读入内存,第二个将 inode 加载到内存中,第三次阅读文件内容。

我曾假设文件系统目录元数据和 inode 将始终由操作系统缓存在 RAM 中,并且文件读取通常只需要 1 个磁盘 IO。

这篇论文中概述的“多个磁盘 IO 读取单个文件”问题是 NAS 设备独有的,还是 Linux 也有同样的问题?

我计划运行一个 Linux 服务器来提供图像。有什么办法可以最大限度地减少磁盘 IO 的数量 - 理想情况下确保操作系统将所有目录和 inode 数据缓存在 RAM 中,并且每个文件读取只需要不超过 1 个磁盘 IO?

sys*_*138 12

这取决于正在使用的文件系统。一些文件系统比其他文件系统更擅长处理大目录问题,是的,缓存确实会影响使用。

旧版本的 EXT3 在处理包含数千个文件的目录时有一个非常糟糕的问题,这个问题在引入 dir_indexes 时得到了修复。如果不使用 dir_index,从包含数千个文件的目录中检索文件可能会非常昂贵。在不知道细节的情况下,我怀疑这就是文章中的 NAS 设备所使用的。

现代文件系统(最新的 ext3、ext4、xfs)比过去更好地处理大目录问题。一些 inode 可能会变大,但通常用于索引目录的 b 树可以非常快速地使用fopen


Tom*_*Tom 5

我曾假设文件系统目录元数据和 inode 将始终缓存在 RAM 中

是的,但你没有学会正确阅读。在您自己引用的段落中,它清楚地说明了:

由于 NAS 设备管理目录元数据的方式,将数千个文件放置在一个目录中的效率极低,因为目录的块图太大而无法由设备有效缓存。

电器是低端硬件。太多元数据 + 太少 RAM = 无法缓存。

如果您运行大型文件服务器,请购买一台,而不是低端设备。