你是否使用过Perf4J来收集和分析Java应用程序的性能指标?

22

您是否在Java应用程序中使用了Perf4J来收集和分析性能统计信息?

您通常使用什么模式(使用日志文件、实用工具、UI、JMX等)?

您是否使用注释和基于AOP的特性?

您是否使用了任何JMX集成?

您如何处理生产配置?

您是否将性能统计视图/报告作为应用程序功能包含其中?

请告诉我们是否以及为什么决定采用其他库或方法。


我已经听说过Perf4J,但从未尝试过,所以我会很感兴趣。 - Mark
3个回答

11

我正在使用Per4j监控WebService端点性能以及内部服务和DAO类的性能。

我主要将原始性能统计数据记录到每日滚动文件中。然后我在命令行上使用jar包来随意分析数据,不同时间段的数据也可以轻松查看。我经常使用-g命令行选项输出一个html文件,这样我就可以打开并可视化查看数据,非常方便。

我喜欢使用Spring AOP的@Profiled注解。它使得时间记录非常简洁。有些人怀疑Per4j会影响性能,但是我可以很容易地通过从Spring applicationContext.xml文件中移除TimingAspect来关闭日志记录。

<!-- just remove and all uses of @Profiled do nothing -->
<bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/>

在性能调优时,要注意均值和最大值。我们进行性能调优时,发现一个方法调用具有大量标准差的异常值。大多数值围绕中位数分布,但是还有一些调用比平均值高100倍。这更多是用户错误,但是需要注意。

我使用AsyncCoalescingStatisticsAppender,时间间隔为15000,但几乎不读日志。因为我有原始性能日志,可以通过在命令行上运行perf4j来进行切换和更改。

我尝试了JMX集成,从文档中得到了承诺的效果。但目前我没有真正的用途。

我计划使用SNMP公开数据,如果有用的话我会做出贡献。

总的来说,我推荐Perf4j。


7

我在一个客户端-服务器应用程序中使用Perf4J来计时RPC调用。它的实现非常简单:我只需要在RPC调度程序servlet周围包含几行代码来测量每个RPC方法调用。时间测量写入单独的日志文件,聚合数据保存在内存中以供图形化servlet使用。配置只需几分钟。

以下是preHandle()方法的摘录:

request.setAttribute("stopWatch", new CommonsLogStopWatch());

这段代码来自postHandle()方法:

LoggingStopWatch stopWatch = (LoggingStopWatch)request.getAttribute("stopWatch");
stopWatch.stop(methodName);

Here are the relevant sections of my log4j.cfg:

<logger name="org.perf4j.TimingLogger" additivity="false">
    <level value="info"/>
    <appender-ref ref="CoalescingStatistics"/>
    <appender-ref ref="statsAppender"/>
</logger>

<appender name="CoalescingStatistics"
          class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender">
    <param name="TimeSlice" value="60000"/>
    <appender-ref ref="graphPatientChart"/>
</appender>

<appender name="graphPatientChart"
          class="org.perf4j.log4j.GraphingStatisticsAppender">
    <param name="GraphType" value="Mean"/>
    <param name="TagNamesToGraph" value="getPatientChart,idleNotification"/>
</appender>

<appender name="statsAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd"/>
    <param name="file" value="WEB-INF/log/meona-performance.log"/>
    <param name="append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
    </layout>
</appender>

我希望图形化servlet更加互动:如果我可以选择要包含在图表中的标签会很好。你有没有遇到过可以用来分析时间测量日志的用户界面应用程序?


Matthias,谢谢你。不,我还没有机会继续使用 perf4j。 - topchef

3

我曾使用过Perf4J,但最终放弃了它,因为我已经在使用Spring AOP。我很想将两者简单地集成起来,但由于Perf4J的appender问题,我遇到了困难。

我尝试使用注解和AOP(无需JMX)来使用Perf4j。 您可以通过配置文件处理生产环境的配置。

总的来说,我喜欢Perf4j的方法,但是由于我已经在使用Spring进行性能监控,所以不需要Perf4j。Perf4j免费提供的一个好处是最小/最大/标准差;但是对于其他库,您需要自己计算这些。

如果您没有其他库可以提供拦截(AspectJ或AOP),那么我认为Perf4j很不错,但由于我已经有了Spring,所以更容易实现性能测量。您可以轻松通过Spring公开bean属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接