Linux:读取一个文件需要多少个磁盘I / O?如何将其最小化?[重复]


10

根据Facebook的Haystack上的这篇论文

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

我以为文件系统目录元数据和索引节点将始终由操作系统缓存在RAM中,并且读取文件通常仅需要1个磁盘IO。

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

我打算运行Linux服务器来提供图像。以任何方式可以减少磁盘IO的数量-理想情况下,确保操作系统将所有目录和inode数据缓存在RAM中,并且读取每个文件只需要不超过1个磁盘IO?


1
这不是问题的答案,但您始终可以使用Varnish(Facebook使用它)来将文件保留在内存中。这样,如果一个映像变热(对同一文件的大量请求),则将根本不使用磁盘IO来提供它

Darhazer-Varnish在这里无济于事,因为Linux文件缓存(Varnish依赖)已经在内存中缓存了热文件。将Varnish放在Nginx前面进行静态文件服务并不会真正增加任何东西。我的问题是文件何时太大/太多而无法在内存中缓存。我仍然要确保至少缓存目录数据和索引节点,以将磁盘IO每次读取减少到1个。

许多文件系统将索引节点存储在目录中,从而将请求数减少了一个,并显着增加了命中高速缓存的机会。但这不是编程问题。
Ben Voigt 2012年

您可以在创建文件系统时更改文件系统的块大小,例如使用使其mke2fs -b 32768变为32k。但是,仅当该文件系统上没有小文件时,此功能才有用。

Answers:


5

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

  • 在文件路径的每个目录级别上进行目录查找。可能有必要读取目录inode和一个或多个目录入口块
  • 文件的索引节点

在普通的IO模式中,缓存确实有效,并且以减少查找的方式分配了索引节点,目录和数据块。但是,实际上由所有文件系统共享的常规查找方法对高度随机化的通信不利。

这里有一些想法:

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

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

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

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

保持目录较小(少于1000个左右)不会有太大帮助,因为您需要将更多目录缓存到其中。


当然,请使用没有完全过时的磁盘目录格式的文件系统。readdir所花费的时间不应超过线性时间,理想情况下,直接访问文件仅是对数时间。
约根森

我在第4点中添加了答案
dmeister 2012年

@dmeister好东西。+1
麦哲伦

@dmeister您的链接已死。
唐·斯科特

1

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

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

如果文件夹包含大量文件,则这是缓存的很大保证。


如果您列出了I / O访问,这可能是更有趣分离那些执行open()从那些进行read()win.tue.nl/~aeb/linux/vfs/trail.html页面显示了所涉及的不同内核概念的全面介绍。(也许已经过时了?我无法告知。)
adl 2012年

0

您可能无法将所有目录和inode数据保留在RAM中,因为您可能拥有比RAM更多的目录和inode数据。您可能也不想这样做,因为RAM可能会更好地用于其他目的。在您的图像示例中,您是否不希望将不经常访问的图像的数据缓存在RAM中而不是不经常访问的图像的目录条目中呢?

就是说,我认为vfs_cache_pressure旋钮用于控制它。“当vfs_cache_pressure = 0时,内核将永远不会由于内存压力而回收内存和索引节点,这很容易导致内存不足的情况。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.