测量方法调用的I / O需求

时间:2015-05-27 14:21:58

标签: java linux io kernel

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

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

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

我正在考虑进一步深入到操作系统接口,尝试调用Syscalls或解析其他内核信息。目前我正在尝试理解像“sar”这样的工具如何测量“iowait”时间以及如何将这些数据映射到我的Java线程和各自的方法。但我不确定我是否正朝着正确的方向前进,因为我的深层操作系统知识有限。

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

提前致谢,bkk

1 个答案:

答案 0 :(得分: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记录中。