我对读取磁盘上大量文件的有效方法感兴趣。我想知道如果我按设备排序文件然后通过inode我会对自然文件读取速度有所提高。
答案 0 :(得分:5)
通过从旋转存储中读取物理顺序的文件,可以大大提高速度。如果有多个进程或线程争用I / O,操作系统I / O调度机制只能执行任何实际工作,因为它们没有关于您计划将来读取哪些文件的信息。因此,除了简单的预读之外,它们通常对你没有任何帮助。
此外,Linux通过以哈希表顺序而不是物理顺序将目录条目返回到用户空间来恶化目录扫描期间的访问模式。幸运的是,Linux还提供系统调用来确定文件的物理位置,以及文件是否存储在旋转设备上,这样您就可以恢复一些损失。例如,请参阅我几年前提交给dpkg的补丁:
http://lists.debian.org/debian-dpkg/2009/11/msg00002.html
此修补程序未包含旋转设备测试,因为此功能直到2012年才添加到Linux中:
我还经常运行一个修补版本的mutt,它会按照物理顺序扫描Maildirs,通常可以提高5x-10x的速度。
请注意,inode很小,需要大量预取和缓存,因此在阅读之前打开文件以获取其物理位置非常值得花费。确实,像tar,rsync,cp和PostgreSQL这样的常用工具不使用这些技术,简单的事实就是这会让它们变得不必要地慢。
答案 1 :(得分:2)
答案 2 :(得分:1)
通常,文件访问的优化技术与存储子系统的体系结构过于紧密,因为它们就像排序算法一样简单。
1)如果您的文件分散到多个物理驱动器(不仅仅是分区),并且您从不同的驱动器并行读取两个或更多文件,则可以有效地将读取数据速率倍增。这个可能是唯一容易实现的方法。
2)按名称或inode编号对文件进行排序在一般情况下并没有真正改变任何内容。你想要的是通过磁盘上<块>块的物理位置对文件进行排序,这样就可以用最少的搜索来读取它们。然而,有很多障碍:
大多数文件系统都不向用户空间应用程序提供此类信息,除非是出于调试原因。
每个文件的块本身可以遍布整个磁盘,尤其是在大多数完整的文件系统上。没有来回搜索,就无法顺序读取多个文件。
您假设您的进程是唯一访问存储子系统的进程。一旦至少有其他人做同样的事情,你提出的每一项优化就会消失。
您正在尝试比操作系统及其自己的缓存和I / O调度机制更智能。通过尝试猜测内核,即真正知道你的系统和你的使用模式的内核,你很可能会让事情变得更糟。
你不觉得,例如如果可以的话,PostreSQL pr Oracle会使用类似的技术吗?当数据库安装在适当的文件系统上时,他们会让内核做它自己的事情,而不是试图猜测它的决定。只有当DB在原始设备上时,才会考虑将物理块考虑在内的专用优化算法。
您还应考虑存储设备的特定属性。例如,现代固态硬盘使传统的搜索时间优化过时。