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

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

根据这个在 Facebook 的 Haystack 上:

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

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

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

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

答案1

这取决于所使用的文件系统。有些文件系统比其他文件系统更擅长处理大型目录问题,而且缓存确实会影响使用。

旧版本的 EXT3 在处理包含数千个文件的目录时存在严重问题,引入 dir_indexes 后这个问题得到了解决。如果不使用 dir_index,从包含数千个文件的目录中检索文件的成本可能非常高。在不了解详细信息的情况下,我怀疑本文中的 NAS 设备就是使用这种方法。

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

答案2

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

是的,但你没有学会正确阅读。你自己引用的那段话里写得很清楚:

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

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

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

答案3

如果您不需要更新文件和目录的访问时间,则使用“noatime”选项挂载文件系统可以节省大量的 I/O 请求。

答案4

这需要仔细测量。如果您的主要目的是提供图像,那么我认为您的网络流量将由它们主导。此外,如果您不进行缓存,磁盘速率应接近网络速率。最后,如果您进行完美缓存,网络速率将保持不变,磁盘速率将变为 0。

换句话说,测量一切!我专门为此使用 collectl,世界上一些最大集群的许多用户也是如此。

只需下载/安装并启动它。它将记录大量您可以播放甚至绘制的内容。然后查看数字并确定您的缓存工作效率如何。

-标记

相关内容