【问题标题】:Measure I/O demands for method invocations测量方法调用的 I/O 需求
【发布时间】:2015-08-09 16:56:52
【问题描述】:

我对 Java EE 应用程序的性能测量(CPU 和磁盘 I/O 需求)感兴趣。

对于CPU,我已经弄清楚了如何衡量每个方法调用的 CPU 需求。通过在每个方法的开头和结尾调用 java.lang.management.ThreadMXBean.getCurrentThreadCpuTime()(例如使用 EJB 拦截器),我可以获得 CPU 处理此方法所需的(“纯”)时间(CPU需求)。

不幸的是,I/O 需求(磁盘:每个方法调用的读写时间)似乎很难衡量。 ThreadMXBean 不提供此类数据。由于暂停和同步时间,仅从每种方法的完整响应时间中减去上述测量的 CPU 需求是不够的(如果可能的话,最好区分读取和写入)。

我正在考虑深入挖掘操作系统接口以尝试调用系统调用或解析其他内核信息。目前,我正在尝试了解“sar”之类的工具如何测量“iowait”时间以及如何将这些数据映射到我的 Java 线程和相应的方法。但我不确定我是否朝着正确的方向前进,因为我对操作系统的深入了解有限。

长话短说:我如何衡量每个方法调用的 I/O 需求(磁盘读取和写入时间)?

提前感谢,bkk

【问题讨论】:

  • 您需要以编程方式进行吗?你使用的是什么JDK?您需要经常运行它还是可以偶尔运行它?
  • 最好是针对所有 JDK 的解决方案,但我也对 JDK 特定的解决方案感到好奇。我想在负载测试期间生成 I/O 测量值以进一步研究我的应用程序,但这里也是如此:所有解决方案都值得赞赏。
  • @bkk87-你甚至可以使用某种 Profiler 来达到同样的效果

标签: java linux io kernel


【解决方案1】:

好的,所以最近我开发了一个小型实用工具,用于测量我们其中一台服务器的一些性能指标。我使用 Java Mission Control (jmc) 来记录指标并随后解析记录文件。在我的情况下,性能测试启动服务器并将基准测试工具附加到它(但您可以将其配置为附加到已启动的实例 - this link 提供了有关如何完成的更多信息)。我将在此处提供一些对您的用例代码行至关重要的代码。

1) 在启动服务器之前,我将以下 JMC 配置添加到命令行:

-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording=delay=5s,duration=120s,name=recording,filename=recording.jfr

所以在命令执行后,延迟 5 秒后,它开始使用默认设置进行录制,并在 120 秒后生成报告文件。 2) 我正在使用以下方法检索 I/O 统计信息:

FlightRecording flightRecording = FlightRecordingLoader.loadFile(new File(...));
IView recording = flightRecording.createView();
for (IEvent event : recording) {
    FLRMethod method = (FLRMethod) event.getValue("((stackTrace).method)");
    /* this shows the bytes read by method at some invocation(if any), 
    so for total bytes read by method you will need to sum manually */
    long bytesRead = Long.valueOf(String.valueOf(event.getValue("bytesRead")));
}

您有很多东西要探索,例如读取/写入文件所花费的时间、读取次数等。您需要进行一些试验才能了解它的一些功能。最新版本的 Java 与 JMC 捆绑在一起。我只用 Java 1.7 和 1.8 尝试过

编辑:正如Klara 指出的那样,您必须考虑阈值,可以在您的设置文件中进行调整。因此,小于配置阈值的操作不会被添加到 JFR 记录中。

【讨论】:

  • 请注意,JFR 在记录事件时使用阈值,因此默认情况下不包括所有低于 10 毫秒的文件读取/写入。以下是有关当前不支持的用于解析录音的 API 的更多信息:hirt.se/blog/?p=459
  • 啊,是的,这是一个重要的注意事项!如果我在回复中添加您的评论,希望您不介意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多