![Linux:读取一个文件需要多少个磁盘 I/O?如何最小化它?](https://linux22.com/image/573856/Linux%EF%BC%9A%E8%AF%BB%E5%8F%96%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E4%B8%AA%E7%A3%81%E7%9B%98%20I%2FO%EF%BC%9F%E5%A6%82%E4%BD%95%E6%9C%80%E5%B0%8F%E5%8C%96%E5%AE%83%EF%BC%9F.png)
根据这个纸在 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,世界上一些最大集群的许多用户也是如此。
只需下载/安装并启动它。它将记录大量您可以播放甚至绘制的内容。然后查看数字并确定您的缓存工作效率如何。
-标记