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

如何配置文件I/O?

  •  8
  • erickson  · 技术社区  · 17 年前

    我们的建造速度慢得令人讨厌。这是一个用 Ant

    观察机器上的总体性能指标,以及将硬件差异与构建时间相关联,表明该进程受I/O限制。它还表明,这个过程比写作做了更多的阅读。

    然而,我还没有找到一个好的方法来确定 哪一个 正在读取或写入文件,以及读取或写入的次数。我的怀疑是,对于我们的许多子项目和编译器的后续调用,构建正在多次重新读取相同的常用库。

    有哪些分析工具可以告诉我给定进程对哪些文件做了什么?免费是好的,但不是必需的。


    使用 Process Monitor, as suggested by Jon Skeet, 我能够证实我的怀疑:几乎所有的磁盘活动都是读取和重读库,JDK的“rt.jar”和其他库的副本在列表的顶部。我不能使一个RAM磁盘足够大来容纳我使用的所有库,但是在一个RAM磁盘上安装“最热”的库可以减少大约40%的构建时间;显然,Windows文件系统缓存做得不够好,尽管我已经告诉Windows为此进行优化。

    我注意到的一件有趣的事情是,计算机上典型的“读取”操作 JAR 文件只有几十个字节;通常有两个或三个,然后在文件中进一步跳过几千字节。它似乎不适合批量读取。

    我要用它做更多的测试 全部的 我的第三方库的一个闪存驱动器,看看有什么影响。

    5 回复  |  直到 8 年前
        1
  •  7
  •   Jon Skeet    17 年前

    如果你 只有 Windows、系统内部需要它吗 Process Monitor 应该向你展示你需要知道的一切。您可以选择流程,然后查看每个操作,并获得文件操作的摘要。

        2
  •  1
  •   Jeffrey Fredrick    17 年前

    一个老掉牙的好东西:创建一个RAM磁盘并从那里编译文件。

        3
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    当我仍然使用Windows时,我曾经通过将所有生成输出写入一个单独的分区(如果大小可能为3GB),并通过一个计划任务定期在夜间格式化这些分区,从而在加速构建的过程中获得良好的效果。这只是构建输出,所以它偶尔被单方压扁也没关系。

    但老实说,自从迁移到Linux之后,磁盘碎片就不再是我担心的事情了。

    在Linux上至少尝试一次构建的另一个原因是,您可以运行 strace 打开 )查看生成所接触的文件。

        4
  •  0
  •   rmeador    17 年前

    我曾经在Windows上使用Ant构建了一个巨大的JavaWebApp(JSP前端),这需要3分钟。我擦了擦我的电脑,安装了Linux,突然间,构建过程耗时18秒。这些都是真实的数字,尽管只有3岁左右。我只能假设Java更喜欢Linux内存管理和线程模型,而不是Windows等效模型,因为根据我的经验(尤其是Eclipse),所有Java程序似乎在Linux下运行得更好。在对未更改的文件(即可执行文件和库)进行大量读取时,Linux似乎可以更好地防止从磁盘进行额外读取。这可能是磁盘缓存或文件系统的属性,我不确定是哪个。

    Java的一大优点是它是跨平台的,因此建立一个基于Linux的构建服务器实际上是您的一个选择。作为Linux的传播者,我当然更愿意看到您将开发环境切换到Linux,但我知道很多人不想这样做(或者出于实际原因不能这样做)。

    如果您甚至不愿意设置Linux构建服务器以查看它是否运行得更快,您至少可以尝试整理Windows计算机的硬盘驱动器。这对我的工作计算机上的C++构建有很大的不同。尝试 JkDefrag ,这似乎比Windows附带的碎片整理程序好得多。

    编辑 当前位置我认为我得到了否决票,因为我的回答没有回答所问的确切问题。然而,StackOverflow的传统是帮助人们解决他们真正的问题,而不仅仅是治疗症状。我不是那种每个问题的答案都是“使用linux”的人。然而,在这个例子中,我有非常真实的、测量过的性能增益,这正是OP询问的情况,因此我认为值得分享我的经验。

        5
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    事实上 FileMon 是比ProcMon更直接的工具。通常,当对磁盘I/O运行性能分析时,考虑以下两个:

    • 吞吐量(每秒读取/写入字节的速度)
    • 延迟(队列中等待读/写的时间)

    推荐文章