代码之家  ›  专栏  ›  技术社区  ›  ivan_ivanovich_ivanoff

现代操作系统上的目录遍历器在多线程时速度较慢?

  •  1
  • ivan_ivanovich_ivanoff  · 技术社区  · 15 年前

    我曾经有过这样的理论:在现代操作系统上,多线程 硬盘上的读取访问应该执行得更好。

    我想:
    操作系统将所有读取请求排队, 并以这样的方式重新排列它们,以便它可以从硬盘读取更多 按顺序。它得到的请求越多,就越能重新安排它们 优化读取顺序。
    我很确定我在什么地方读过几次。

    但我做了一些基准测试,不得不发现,多线程 读访问的性能大多很差,从来没有比这更好的。

    我有在windows和linux下的经验。我的基准是纯 使用操作系统的工具搜索文件,以及 写了自己的小基准。

    我遗漏了什么吗?
    有人能给我解释一下这个话题的秘密吗?
    谢谢您!

    6 回复  |  直到 12 年前
        1
  •  2
  •   SpliFF    15 年前

    很明显你让读头到处乱跑。你的瓶颈是磁盘,而不是处理器。

    换言之,CPU可能是并行的,但磁盘不是。

        2
  •  2
  •   Opmet    12 年前

    解决方案: 使用NCQ提高性能。为此,请将您的sata hdd控制器配置为使用ahci。

    其他详细信息如下:

    在分析一个特定的应用程序时,我也做了类似的观察。在我的四核系统上,我比较了以下配置:

    • 单核:相当快
    • 4核启动:慢得多!这让我很惊讶,也让我困惑。

    结果发现应用程序正在进行大量的并发hdd访问。如果有多个内核(因此有多个线程),这将 明显地 降低总执行时间。

    我做了一些研究,发现一个叫做 NCQ (本机命令队列)将对您所指的hdd访问进行优化。

    在scsi世界中,这已经是很长一段时间以来的通用标准。在世达的世界里,它早就被改编了。 要解锁此功能,需要将HDD控制器配置为在 阿希 模式-这是使用NCQ的先决条件!

    由于现在普通的桌面系统使用的是车载硬盘控制器,所以这个配置部分需要在 BIOS设置 . 对于sata配置,您通常可以在以下操作模式之间进行选择:

    • 兼容/传统IDE
    • 阿希

    我继续并实现了自己的自定义基准测试,以比较一个和同一个运行的系统与以下配置:

    • 支持4核,传统IDE:相当慢
    • 启用4核,ahci/ncq:更快。特定的基准测试部分执行速度提高了6倍!

    ——

    结论 :

    要释放具有并发HDD访问的系统的全部功能,请执行以下操作:

    1. 切换到 阿希 (所以你可以利用 NCQ )
    2. 不要使用 通用的 操作系统附带的ahci驱动程序。相反,使用特定于供应商的, 优化的驱动程序 . 示例:Windows7附带了一些通用的AHCI驱动程序,这些驱动程序支持大多数常见的HDD控制器。但是,使用英特尔芯片组时,请确保安装英特尔“矩阵存储管理器”或英特尔“快速存储技术”(如英特尔RST 11.7)。优化的驱动程序已经证明可以进一步提高硬盘的性能。

    不这样做会使一些应用程序运行 更慢的 当使用多个线程而不是单个线程时。这是你需要考虑的一个令人惊讶的部分。

    ——

    注:有一个神话说: NCQ只与“服务器”环境相关(数百个进程并行运行) . 我的基准测试结果指向了另一个方向: 它也适用于“桌面”环境。每当发生大量并发hdd访问时 .

    附加说明:

    1. 一些较旧的芯片组/sata hdd控制器不支持ahci模式。但这不包括在内。
    2. 当以ahci模式安装或将一个已经存在的系统从ide模式迁移到ahci时,一些“旧”操作系统需要特殊的操作。但这不包括在内。
        3
  •  1
  •   Rick    15 年前

    你是否看到加速几乎可以肯定地取决于你正在看的场景和硬件。更多关于基准测试方法的细节在这里会很有用。

    粗略地说,当你 利用I/O控制器及其缓存的最大吞吐量,或者当I/O与CPU密集型工作重叠时,它们会被阻塞等待。

    您比较的是读取分布在系统中的多个小文件,还是按顺序读取几个大文件?您将在这里看到不同的性能特征。

    你有没有用一个很好的系统剖析器来剖析(免费的) windows performance toolkit 看看你的基准是怎么回事?这几乎是必须的。

    这样的基准可以很有趣地编写和描述,不要让一些错误的开始妨碍了深入挖掘和寻找加速。

    -里克

        4
  •  1
  •   Peter Ruderman    15 年前

    我认为你关于操作系统优化并发磁盘访问的假设是错误的。我想当您从一个线程中使用分散/聚集I/O时,它会进行这种重新排序,但是没有实际的方法可以用这种方式优化并发请求。任何这样的方案都会在单线程读取中引入不必要的延迟。(操作系统必须稍等一段时间,以防出现并发请求。)总之,简短的回答是,您的并发请求会导致读取头到处跳跃。操作系统无法将其优化。

        5
  •  1
  •   AngerClown    15 年前

    我认为您所说的是本机命令队列,它可能在您正在测试的系统上启用,也可能不启用。从 the Wikipedia entry :

    事实上,较新的主流linux内核本机支持ahci。即使主机总线适配器上存在ahci,windows xp也需要安装特定于供应商的驱动程序。Windows Vista本机支持AHCI和NCQ。FreeBSD从8.0版开始完全支持AHCI和NCQ。

    另外,我还没有做过任何测试,但是对于一个必须访问整个磁盘上的小文件/索引节点的目录遍历来说,ncq可能没有那么有效。这可能是因为磁盘控制器能够足够快地为每个请求提供服务,以至于永远不会建立队列来重新排序,因此您看不到任何好处。

        6
  •  1
  •   Ross Judson    15 年前

    在这里很重要的一点是 阅读 对目录或文件信息的处理远离了该信息。换句话说,磁盘IO在一个线程中,在另一个线程中处理和搜索。将完成的IO信息传递给具有有界队列的处理线程。通过这样做,您将确保IO线程在忙于读取下一个要处理的数据块之前从不等待结果的处理。