使用 Perf4j 简化应用分析

  • Ian Roughley
  • 张龙

2009 年 2 月 20 日

话题:Java语言 & 开发架构

Perf4J 提供的很多特性都令人耳目一新:

  • 用于计时的简单的停止观测(stop watch)机制。
  • 用于解析日志文件的命令行工具,可以生成聚合统计和性能图表
  • 轻松集成大多数常见的日志框架和门面:log4j、java.util.logging、Apache Commons Logging 及 SLF4J。
  • 客户化的 log4j appenders,可以在应用运行时生成统计和图表(不久还会提供客户化的 java.util.logging 处理器)。
  • 可以将性能统计暴露为 JMX 属性,当统计超出指定极限时发送通知。
  • 用于展现 Web 应用性能图表的 Servlet。
  • 提供了 @Profiled 注解和一套客户化的方面(aspect),在处理 AOP 框架如 AspectJ 或 Spring AOP 时可以灵活插入计时语句。
  • 可扩展的架构

InfoQ 有幸采访了 Perf4j 项目的领导者 Alex Devine,他谈到了开发 Perf4j 的缘由:

在认识到性能跟踪和管理问题会严重影响到公司的每个项目(事实上会影响到几乎所有的基于服务器的、分布式应用)后,我们决定构建并开发一个标准的性能库,最后就诞生了 Perf4J。

“Perf4j 能解决哪些特殊的性能问题呢”?

Perf4J 非常适合于分布式、面向服务的应用的性能问题跟踪。例如,用户点击 Homeaway 上的某个搜索页面后就会发出对 Web 服务器的一个调用,该 Web 服务器又会调用数据库,同时还会通过 HTTP 调用搜索服务和广告服务器。搜索服务本身会将各个搜索结点生成的结果聚合起来。如果在产品环境下性能出现了问题,我们可以通过 Perf4j 轻松快速的查明出问题的组件。

这导致了另一个问题“Perf4j 可以用在产品环境中么?”

Perf4J 明确定位于产品环境中。事实上,很多时候在每个阶段上一切都很好,但放到了产品环境下就会出现各种问题,在出现大的性能问题前就提早做好准备对于问题的跟踪是大有裨益的。

对于性能开销,Alex 说到:

其开销与日志类似,就像在代码前后使用 System.currentTimeMillis() 并记录日志一样,你可以在通过开始和停止 StopWatch 来实现这一切。这样类似于日志,其花费最终取决于附加的 appenders。AsyncCoalescingStatisticsAppender 仅是将日志消息压入到队列中并由单独线程中 downstread appenders 的取出,这样当这些 appenders 完成处理后不会影响到主线程的执行时间。此外,如果通过加载时间(load-time)来使用 @Profiled 注解,你可以定义运行中所分析的方法,在这种情况下,那些不做分析的方法就无需任何额外的设置。

关于未来 Alex 说到:

我们想对那些没有 StopWatch 或 @Profiled 注解的方法也进行运行时分析。也就是说开发者可以在 aop.xml 或 Spring 配置文件中指定要分析的方法。这样就可以分析第三方库(他们并不知道 Perf4J),而且无需在源代码中使用分析语句了。

可以从 http://perf4j.org下载 Perf4j。

查看英文原文:Profiling Just Got Easier With Perf4j
Java语言 & 开发架构