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

根据Facebook的Haystack上的这个paper

Because of how the NAS appliances manage directory metadata, placing
thousands of files in a directory was extremely inefficient as the
directory’s blockmap was too large to be cached effectively by the
appliance. Consequently it was common to incur more than 10 disk
operations to retrieve a single image. After reducing directory sizes
to hundreds of images per directory, the resulting system would still
generally incur 3 disk operations to fetch an image: one to read the
directory metadata into memory, a second to load the inode into
memory, and a third to read the file contents.

我假设了文件系统目录元数据&操作系统总是将inode缓存在RAM中,读取文件通常只需要1个磁盘IO.

这篇文章中列出的“多个磁盘IO是读取单个文件”的问题是NAS设备特有的,还是Linux也有同样的问题?

我打算运行一个Linux服务器来提供图像.我可以通过任何方式最小化磁盘IO的数量 – 理想情况下确保操作系统缓存所有目录& RAM中的inode数据和每个文件读取只需要不超过1个磁盘IO?

最佳答案
Linux有同样的“问题”. Here是我两年前发表的一篇论文,其中的效果在Linux上显示.多个IO可以来自多个来源:

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

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

以下是一些想法:

1)与文件系统相关的缓存有帮助.大缓存将吸收大部分读取.但是,如果要在计算机中放置多个磁盘,则磁盘到RAM的比率会限制缓存的数量.

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

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

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

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

转载注明原文:Linux:读取文件需要多少磁盘I/O?如何最小化? - 代码日志