- 浏览: 484438 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
龘龘龘:
TrueBrian 写道有个问题,Sample 1中,为了控制 ...
What's New on Java 7 Phaser -
龘龘龘:
楼主总结的不错。
What's New on Java 7 Phaser -
TrueBrian:
有个问题,Sample 1中,为了控制线程的启动时机,博主实际 ...
What's New on Java 7 Phaser -
liguanqun811:
不知道楼主是否对zookeeper实现的分布式锁进行过性能测试 ...
Distributed Lock -
hobitton:
mysql的get lock有版本限制,否则get lock可 ...
Distributed Lock
1 Overview
Perf4j是一个用于计算和显示性能相关的统计信息(例如最大值、最小值、算数平均均值、标准方差和TPS等)的工具集。除了将统计信息输出到标准错误流或者日志中之外,Perf4j也支持输出为图表(使用Google Chart API),以及通过JMX公开。其主要的功能如下:
- 以StopWatch这种简洁的方式进行计时。
- 提供了一个命令行工具,用于分析日志以及生成统计信息或图表。
- 易于集成到大部分已有的日志工具中,例如log4j, java.util.logging, Apache Commons Logging and SLF4J。
- 提供了定制的log4j appenders用于实时地生成统计信息。
- 支持以JMX的方式公开统计信息,在特定的统计信息超过指定阀值时可以发送通知。
- 提供了一个servlet,用于在web应用中以图表的形式显示统计信息。
- 支持以AOP的方式进行计时。
以下是个使用Perf4j的简单的例子:
StopWatch stopWatch = new Log4JStopWatch("tag0"); Thread.sleep(1000L); stopWatch.stop();
需要注意的是这里的StopWatch不是Jakarta Commons的StopWatch。目前比较流行的Slf4j的扩展包中也包含个StopWatch。Slf4j的扩展包中同样也提供了基本的profiling功能(笔者感觉比Perf4j还要全面一些),但是目前Slf4j还不支持生成统计信息。
以上的代码执行后会在日志中打印如下的信息:
2009-06-11 20:46:59,833 INFO [main - Log4JStopWatch.java:304] start[1244724418833] time[1000] tag[tag0]
其中与start对应的方括号中的内容是StopWatch在构造时的系统时间(毫秒数)。与time对应的方括号中的内容是调用其stop方法前经过的时间(毫秒数)。与tag对应的方括号中的内容是构造StopWatch时指定的标签名。
如果使用org.perf4j.LoggingStopWatch,那么会在标准错误流中输出如下的信息:
start[1244724581786] time[1000] tag[tag0]
除了指定标签名之外,也可以指定一个可选的消息。例如:
StopWatch stopWatch = new LoggingStopWatch(); try { ... stopWatch.stop("tag0.success", "normal case"); } catch (Exception e) { stopWatch.stop("tag0.failure", "exceptional case"); }
2 Generating Performance Statistics
Perf4j提供了LogParser用于分析日志以生成统计信息。假设terminal.log日志中的内容如下:
start[1244726067645] time[297] tag[tag1]
start[1244726067958] time[546] tag[tag1]
start[1244726068504] time[454] tag[tag1]
start[1244726068989] time[219] tag[tag1]
start[1244726069208] time[125] tag[tag1]
start[1244726069333] time[500] tag[tag1]
start[1244726069833] time[859] tag[tag1]
start[1244726070692] time[422] tag[tag1]
start[1244726071114] time[62] tag[tag1]
start[1244726071176] time[875] tag[tag1]
在命令行上执行java -jar perf4j-0.9.10.jar terminal.log 后输出如下:
Performance Statistics 21:14:00 - 21:14:30 Tag Avg(ms) Min Max Std Dev Count
tag1 428.6 125 859 226.2 7
Performance Statistics 21:14:30 - 21:15:00 Tag Avg(ms) Min Max Std Dev Count
tag1 453.0 62 875 332.6 3
以上的统计信息使用了默认的取样间隔,即30秒。Perf4j也支持以csv或者图表的方式输出统计信息,例如:
java -jar perf4j-0.9.10.jar -f csv terminal.log
java -jar perf4j-0.9.10.jar --graph perfGraphs.html terminal.log
3 Generating Read-Time Performance Statistics
3.1 Using LogParser
如果没有指定日志文件,那么LogParser默认会从标准输入流中读取数据,因此可以使用tail命令和管道来生成实时的统计信息,例如:
tail -f terminal.log | java -jar perf4j-0.9.10.jar
此外如果使用Log4j,那么可以通过Log4j的SocketAppender等将日志发送到远程的机器后再进行日志的分析。Log4j的SocketAppender默认是将LoggingEvent序列化后发送到远程的机器。如果担心性能问题,那么可以考虑使用定制的消息和定制的序列化方式。笔者曾写过两个定制的SocketAppender(使用plain socket或者mina),可以减少一半以上的数据传输量。
3.2 Using Custom Appender
目前Perf4j支持通过使用定制的Log4j appenders来生成实时的统计信息。其中最重要的appender是AsyncCoalescingStatisticsAppender。以下是个Log4j配置文件的例子:
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%t - %F:%L] %m%n" /> </layout> </appender> <appender name="CoalescingStatistics" class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"> <param name="TimeSlice" value="2000"/> <appender-ref ref="console"/> </appender> <logger name="org.perf4j.TimingLogger" additivity="false"> <level value="INFO"/> <appender-ref ref="CoalescingStatistics"/> </logger> <root> <level value="INFO"/> <appender-ref ref="console"/> </root> </log4j:configuration>
AsyncCoalescingStatisticsAppender的TimeSlice属性指定了统计的采样时间,默认是30秒。org.perf4j.TimingLogger的additivity属性指定了除了统计信息之外,原始的计时信息是否也要输出到日志中。
应用程序的代码片段如下:
for(int i = 0; i < 10; i++) { StopWatch stopWatch = new Log4JStopWatch("tag1"); Thread.sleep((long)(Math.random() * 1000L)); stopWatch.stop(); }
以下是日志中输出的内容:
2009-06-11 21:59:22,676 INFO [perf4j-async-stats-appender-sink-CoalescingStatistics - ?:?] Performance Statistics 21:59:20 - 21:59:22
Tag Avg(ms) Min Max Std Dev Count
tag1 828.0 656 1000 172.0 2
2009-06-11 21:59:24,676 INFO [perf4j-async-stats-appender-sink-CoalescingStatistics - ?:?] Performance Statistics 21:59:22 - 21:59:24
Tag Avg(ms) Min Max Std Dev Count
tag1 515.8 172 954 331.4 4
3.3 Using JMX
通过使用JmxAttributeStatisticsAppender,可以将统计信息公开为JMX MBeans。此外可以在统计信息超过指定阀值的时候发送notifications。以下是个Log4j配置文件的例子:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%t - %F:%L] %m%n" /> </layout> </appender> <appender name="CoalescingStatistics" class="org.perf4j.log4j.AsyncCoalescingStatisticsAppender"> <param name="TimeSlice" value="2000"/> <appender-ref ref="jmxAppender"/> </appender> <appender name="jmxAppender" class="org.perf4j.log4j.JmxAttributeStatisticsAppender"> <param name="TagNamesToExpose" value="tag1"/> </appender> <logger name="org.perf4j.TimingLogger" additivity="false"> <level value="INFO"/> <appender-ref ref="CoalescingStatistics"/> </logger> <root> <level value="INFO"/> <appender-ref ref="console"/> </root> </log4j:configuration>
Perf4j通过JMX公开的MBean的ObjectName是org.perf4j:type=StatisticsExposingMBean,name=Perf4J。
4 Unobtrusive Logging with @Profiled and AOP
如果不希望在应用程序中加入LoggingStopWatch之类的计时语句,那么可以考虑使用Perf4j提供的@Profiled,当然还需要一个AOP的framework,例如AspectJ或者Spring AOP。以下是个使用Spring AOP的例子:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <aop:aspectj-autoproxy/> <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect"/> <bean id="primeGenerator" class="PrimeGenerator"> <property name="currentPrime" value="13"/> </bean> </beans>
程序的代码片段如下:
public class PrimeGenerator { private BigInteger currentPrime = new BigInteger("0"); public void setCurrentPrime(BigInteger currentPrime) { this.currentPrime = currentPrime; } @Profiled public BigInteger nextPrime() { currentPrime = currentPrime.nextProbablePrime(); return currentPrime; } public static void main(String[] args) throws Exception { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring.xml"); PrimeGenerator pg = (PrimeGenerator) applicationContext.getBean("primeGenerator"); pg.nextPrime(); } }
日志中的输出如下:
2009-06-11 22:52:11,833 INFO [main - Log4JStopWatch.java:304] start[1244731931411] time[422] tag[nextPrime]
评论
It's under Apache License Version 2.0.
Business friendly!
发表评论
-
Understanding the Hash Array Mapped Trie
2012-03-30 10:36 0mark -
A Hierarchical CLH Queue Lock
2012-01-14 19:01 2152A Hierarchical CLH Queue Lock ( ... -
Inside AbstractQueuedSynchronizer (4)
2012-01-08 17:06 3527Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (3)
2012-01-07 23:37 4755Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (2)
2012-01-07 17:54 6371Inside AbstractQueuedSynchroniz ... -
Inside AbstractQueuedSynchronizer (1)
2012-01-06 11:04 7953Inside AbstractQueuedSynchroniz ... -
Code Optimization
2011-10-14 00:11 1613当前开发人员在进行编码的时候,可能很少关注纯粹代码级别的优化了 ... -
Distributed Lock
2011-08-02 22:02 92171 Overview 在分布式系统中,通常会 ... -
What's New on Java 7 Phaser
2011-07-29 10:15 82871 Overview Java 7的并 ... -
Sequantial Lock in Java
2011-06-07 17:00 22231 Overview Linux内核中常见的同步机 ... -
Feature or issue?
2011-04-26 22:23 121以下代码中,为何CglibTest.intercept ... -
Bloom Filter
2010-10-19 00:41 50811 Overview Bloom filt ... -
Inside java.lang.Enum
2010-08-04 15:40 64831 Introduction to enum J ... -
Open Addressing
2010-07-07 17:59 34811 Overview Open addressi ... -
JLine
2010-06-17 09:11 11014Overview JLine 是一个用来处理控 ... -
ID Generator
2010-06-14 14:45 1684关于ID Generator,想 ... -
inotify-java
2009-07-22 22:58 83141 Overview 最近公 ... -
Progress Estimator
2009-02-22 19:37 1538Jakarta Commons Cookbook这本书 ... -
jManage
2008-12-22 00:40 39591 Overview 由于项目需要, 笔者开发了一个 ... -
JMX Remoting
2008-09-24 10:29 60811 Introduction Java Manage ...
相关推荐
标题中的"perf4j perf4j perf4j"重复可能是由于格式错误,但明显指的是 Perf4J 这个库。描述部分同样如此,没有提供具体的信息,因此我们将基于Perf4J的基本特性和使用方法来展开讨论。 Perf4J的核心功能包括: 1....
《Perf4j整合Logback:提升日志性能与监控》 Perf4j是一个轻量级的Java性能度量库,它提供了简单的方法来度量代码执行的时间,并且能够集成到现有的日志框架中,如Logback。Perf4j的引入可以有效地帮助我们跟踪和...
perf4j-0.9.16-log4jonly.jar
Perf4J 是一个轻量级的 Java 性能监控工具,它提供了一种简单的方式来度量和记录代码执行的时间。通过集成各种日志框架,如 Log4J 和 Commons Logging,Perf4J 可以将性能数据记录到日志文件中,以便后续分析和优化...
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.16/perf4j-0.9.16.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.14/perf4j-0.9.14.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.13/perf4j-0.9.13.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.12/perf4j-0.9.12.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.15/perf4j-0.9.15.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.8.1/perf4j-0.9.8.1.jar
集成Perf4j到Seam项目中,首先需要在项目的类路径下添加Perf4j和Seam-Perf4j的依赖库。"seam-perf4j-0.5.0"压缩包中可能包含了这些库的JAR文件,它们包含所需的类和资源,以便Seam能够识别并使用Perf4j的功能。在...
Perf4j是一个强大的开源库,专为Java应用程序设计,提供了一套全面的工具,用于跟踪和记录性能指标。而Perf4j integration for CDI (JSR-299)则是这个库的一个扩展,旨在与CDI(Contexts and Dependency Injection,...
定时Timing 是一个使用 perf4j 记录调用时间的简单库。用法 [timing "0.1.2"]定时只需包装要计算调用时间的表单: ( timed :tag ( look-up-db ...) ( assemble-data ...)) 请注意,您必须提供一个tag来识别计时日志...
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.7/perf4j-0.9.7.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.11/perf4j-0.9.11.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.6/perf4j-0.9.6.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.10/perf4j-0.9.10.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.9/perf4j-0.9.9.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.8/perf4j-0.9.8.jar
性能统计日志和监控工具包扩展到 log4j、logback 和 java.util.logging 框架。 org.perf4j/perf4j/0.9.4/perf4j-0.9.4.jar