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

10 linux filesystems

根据Facebook 的 Haystack 上的这篇论文

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

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

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

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

dme*_*ter 5

Linux 也有同样的“问题”。是我的一个学生两年前发表的一篇论文,在 Linux 上显示了效果。多个 IO 可以来自多个来源:

  • 在文件路径的每个目录级别上进行目录查找。可能需要读取目录 inode 和一个或多个目录项块
  • 文件的inode

在正常的 IO 模式中,缓存确实有效,并且以减少查找的方式分配 inode、目录和数据块。然而,所有文件系统实际上共享的正常查找方法对于高度随机化的流量是不利的。

这里有一些想法:

1) 文件系统相关的缓存帮助。大缓存将吸收大部分读取。但是,如果您想在一台机器中放置多个磁盘,则磁盘与 RAM 的比率会限制缓存的数量。

2)不要使用数百万个小文件。将它们聚合为更大的文件并将文件名和偏移量存储在文件中。

3) 将元数据放置或缓存在 SSD 上。

4) 当然,使用没有完全无序的磁盘目录格式的文件系统。readdir 不应花费超过线性时间,直接文件访问理想情况下只需对数时间。

保持目录小(小于 1000 左右)应该没有太大帮助,因为您需要更多的目录需要缓存到。


小智 1

这取决于您计划使用的文件系统。读取文件数据系统之前:

  • 读取目录文件。
  • 读取你的文件的索引节点
  • 读取文件的扇区

如果文件夹包含大量文件,这对缓存来说是很大的压力。