4

我对读取磁盘上大量文件的有效方法感兴趣。我想知道我是否按设备排序文件,然后按 inode 对自然文件读取进行一些速度改进。

4

3 回答 3

6

从旋转存储中按物理顺序读取文件可以大大提高速度。操作系统 I/O 调度机制仅在有多个进程或线程争用 I/O 时才真正起作用,因为它们不知道您计划在未来读取哪些文件。因此,除了简单的预读之外,它们通常对您毫无帮助。

此外,Linux 在目录扫描期间通过以哈希表顺序而不是物理顺序将目录条目返回到用户空间来恶化您的访问模式。幸运的是,Linux 还提供系统调用来确定文件的物理位置,以及文件是否存储在旋转设备上,因此您可以恢复部分丢失。例如,看看我几年前提交给 dpkg 的这个补丁:

http://lists.debian.org/debian-dpkg/2009/11/msg00002.html

此补丁不包含对旋转设备的测试,因为此功能直到 2012 年才添加到 Linux:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ef00f59c95fe6e002e7c6e3663cdea65e253f4cc

我也曾经运行过一个补丁版本的 mutt,它会按物理顺序扫描 Maildirs,通常可以提高 5 到 10 倍的速度。

请注意,inode 很小,需要大量预取和缓存,因此在读取之前打开文件以获取其物理位置非常值得。确实,tar、rsync、cp 和 PostgreSQL 等常用工具不使用这些技术,而简单的事实是,这会使它们不必要地变慢。

于 2013-04-14T02:33:33.627 回答
2

早在 1970 年代,我向我们的计算机中心提议,如果他们以最小化寻道时间的方式组织磁盘读取和/或写入队列,那么从磁盘读取/写入磁盘总体上会更快,我被告知计算机中心,他们的实验和来自 IBM 的信息,许多研究已经通过多种技术进行,并且如果磁盘读/写按照先到先服务的顺序完成,则 JOBS(不仅仅是单个作业)的整体吞吐量是最佳的。这是一个 IBM 批处理系统。

于 2012-08-05T07:23:38.770 回答
1

一般而言,文件访问的优化技术与存储子系统的体系结构紧密相关,以至于不能像排序算法那样简单。

1) 如果您的文件分散到多个物理驱动器(不仅仅是分区)并且您从不同的驱动器并行读取两个或多个文件,您可以有效地增加读取数据速率。这可能是唯一易于实现的方法。

2) 在一般情况下,按名称或 inode 编号对文件进行排序并不会真正改变任何内容。您想要的是按文件块在磁盘上的物理位置对文件进行排序,以便可以通过最少的查找来读取它们。然而,有不少障碍:

  • 大多数文件系统不向用户空间应用程序提供此类信息,除非出于调试原因。

  • 每个文件的块本身可以分布在整个磁盘上,尤其是在几乎完整的文件系统上。如果不来回查找,就无法按顺序读取多个文件。

  • 您假设您的进程是唯一访问存储子系统的进程。一旦至少有其他人在做同样的事情,你提出的每一个优化都会消失。

  • 您正在尝试比操作系统及其自己的缓存和 I/O 调度机制更智能。通过尝试对内核进行事后猜测,即唯一真正了解您的系统和使用模式的内核,您很可能会使事情变得更糟。

  • 如果可以的话,您不认为例如 PostreSQL pr Oracle 会使用类似的技术吗?当数据库安装在适当的文件系统上时,他们让内核做它的事情,而不是试图猜测它的决定。只有当数据库位于原始设备上时,考虑物理块的专门优化算法才会发挥作用。

  • 您还应该考虑存储设备的特定属性。例如,现代 SSD 使传统的寻道时间优化变得过时。

于 2011-02-28T17:18:50.960 回答