【问题标题】:How can I profile file I/O?如何配置文件 I/O?
【发布时间】:2010-10-04 08:06:51
【问题描述】:

我们的构建速度非常慢。这是一个用Ant 构建的Java 系统,我在Windows XP 上运行我的系统。根据硬件的不同,可能需要 5 到 15 分钟才能完成。

观察机器上的整体性能指标,以及将硬件差异与构建时间相关联,表明该进程受 I/O 限制。它还表明,该过程的读取比写入多得多。

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

有哪些分析工具可以告诉我给定进程正在处理哪些文件?免费很好,但不是必需的。


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

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

我将在闪存驱动器上使用我的所有第三方库进行更多测试,看看会产生什么效果。

【问题讨论】:

  • 一个快速的问题 erickson,您是如何计算出 ProcessMonitor 正在读取多少字节的?我在尝试使用 Windows XP 分析我们的构建时遇到了同样的问题
  • 刚刚想通了,在ReadFile操作的Detail列中,比如Offset: N bytes, Length: M bytes等等。

标签: java windows build-process profiling


【解决方案1】:

如果您在 Windows 上需要它,SysInternals Process Monitor 应该会向您展示您需要知道的一切。您可以选择进程,然后查看每个操作,并获得文件操作的摘要。

【讨论】:

  • 谢谢约翰。我过去使用过 Process Explorer。这是该产品的后继产品,还是完全独立的产品?
  • Process Explorer 是任务管理器的替代品。 Process Monitor 向您显示每个 I/O 操作,例如打开文件、写入注册表等...
【解决方案2】:

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

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

如果您甚至不愿意设置 Linux 构建服务器来查看它是否运行得更快,那么您至少可以尝试对 Windows 计算机的硬盘驱动器进行碎片整理。这对在我的工作计算机上构建 C++ 产生了巨大的影响。试试JkDefrag,好像比Windows自带的碎片整理好很多。

编辑:我假设我得到了反对票,因为我的回答没有解决所提出的确切问题。然而,StackOverflow 的传统是帮助人们解决他们真正的问题,而不仅仅是治疗症状。我不是那种对每个问题的答案都是“使用 linux”的人。然而,在这种情况下,我在 OP 所询问的情况下获得了非常真实的、可衡量的性能提升,因此我认为值得分享我的经验。

【讨论】:

  • 虽然我不怀疑切换到 linux 会提高性能,但这很难回答有关在 Windows 上分析 IO 的问题
  • 感谢 rmeador。我们的很多开发人员都运行 Linux,它确实有帮助。它的文件系统缓存似乎比 Windows 的要好得多。还有一些人怀疑微软故意阻碍了非 M$ 代码对内核调用的性能。 ;) 然而,即使是 Linux 构建也太慢了。
【解决方案3】:

当我仍然使用 Windows 时,我曾经通过将所有构建输出写入单独的分区(如果大小可能为 3 GB)并通过计划任务在每周晚上定期格式化一次来获得良好的结果,从而加快构建速度。它只是构建输出,所以偶尔单方面变平也没关系。

但老实说,自从迁移到 Linux 后,我再也不用担心磁盘碎片了。

在 Linux 上至少尝试一次构建的另一个原因是,您可以运行 strace(grepped 以调用 open)来查看您的构建涉及哪些文件。

【讨论】:

  • Procmon/Filemon 向 strace 提供类似(实际上)的信息。我能够看到每个打开的元数据查询、读取和写入操作。
【解决方案4】:

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

【讨论】:

  • 我对 IO 进行剖析的目标是找出在 RAM 磁盘上的最大好处。
【解决方案5】:

其实FileMon是比ProcMon更直接的工具。一般来说,在对磁盘 I/O 进行性能分析时,请考虑以下两个方面:

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

一旦您根据上述内容评估了系统的性能,就很容易确定瓶颈并采取纠正措施:获得更快的磁盘或更改您的代码(以更便宜的方式为准)。

【讨论】:

  • 实际上,在您回答时,FileMon 已经是 ProcMon 的已弃用子集版本。 -1.
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2010-12-25
  • 2012-06-09
  • 1970-01-01
  • 2013-09-22
  • 2015-11-13
  • 2016-02-09
  • 2013-05-06
相关资源
最近更新 更多