22

Did you use Perf4J in your Java application to collect and analyze performance stats?

What was the typical pattern (using log files, utilities, UI, JMX, etc.)?

Did you use annotations and AOP-based features?

Did you use any JMX integration?

How did you handle production configuration?

Did you include performance stats views/reports as a feature in your application?

Please tell if and why you decided on alternative library/approach.

4

3 回答 3

11

我正在使用 Per4j 来监控 Web 服务端点性能以及内部服务和 dao 类性能。

我主要只是将原始性能统计信息记录到每日滚动文件中。然后我在命令行上使用jar来分析不同时间片的数据。我经常使用-g命令行选项来输出一个 html 文件,然后我可以打开该文件并直观地查看数据,这非常有用。

我喜欢使用带有@Profiled注释的 Spring AOP。它使时间非常干净。TimingAspect我对 perf4j 降低性能有一些怀疑,我可以很容易地提供我可以通过从我的 Spring applicationContext.xml 文件中删除来关闭日志记录。

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

注意平均值并注意最大值。在进行性能调优时,我们有一个方法调用具有很大的标准偏差。大多数值都在中位数附近,但也有少量调用是平均值的 100 倍。用户错误比任何事情都多,但要小心。

我使用AsyncCoalescingStatisticsAppender15000 的时间片,但几乎没有阅读日志。因为我有原始性能日志,所以我可以通过在命令行上运行 perf4j 来修改和更改它。

我尝试了 JMX 集成,它按照文档中的承诺工作。但我目前没有真正的用处。

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

总之,我推荐 Perf4j。

于 2011-03-17T07:10:33.493 回答
7

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

这是 preHandle() 方法的摘录:

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

postHandle() 方法中的这段代码:

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

以下是我的 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 更具交互性:如果我可以选择要包含在图形中的标签,那就太好了。您是否遇到过可用于分析时间测量日志的 UI 应用程序?

于 2010-07-29T22:48:53.143 回答
3

我使用过 Perf4J,但最终放弃了它,因为我已经在使用 Spring AOP。我很想简单地将两者集成,但遇到了麻烦(因为 Perf4J 附加程序)。

我尝试通过注释和没有 JMX 的 AOP 使用 Perf4j。您可以通过配置文件处理生产配置文件。

总的来说,我喜欢 Perf4j 方法,但由于我已经在使用 Spring 进行性能监控,所以我不需要 perf4j。Perf4j 免费提供的一件事是最小/最大/标准开发;与其他库你必须自己做数学。

如果您没有任何其他可以提供拦截的库(aspectJ 或 AOP),我认为 perf4j 很好,但是由于我已经有了 spring,因此更容易实现性能测量。您可以通过 JMX 和 Spring 轻松地公开 bean 属性。

于 2010-02-12T14:23:12.607 回答