性能调优-性能监控

日前要对负责一老系统做性能调优 。首先希望能够通过采样对线上的方法的一个性能情况做一个了解 。于是想到了之前接触过得perf4j  。 工具本身就不做过多的说明了。 主要讲下在这个过程中的一个思路 。perf4j主要有几种使用方法
1 . 简单的利用stopWatch对系统方法做监控 .
	public static void main(String args[]){


		StopWatch stopWatch = new Log4JStopWatch("getMessage()");

		new Perf4jStep().getMessage(10000, 1) ;
		stopWatch.stop();

	}

通过上面代码,可以在日志文件中看到
2011-07-29 14:41:55,498 INFO  perf4j.TimingLogger - start[1311921714859] time[639] tag[getMessage()]

其中tag[getMessage()]表明监控的方法名 , start[1311921714859]表示执行该方法的开始时间, time[639]表示执行该方法的消耗时间 。这样就能实现一个简单的性能数据采样了 。当然,我并没有采用该方式,因为对系统代码有比较强的侵入性, 必须在每个业务方法内写入类似的代码。 于是 ,我查了下perf4j的官网,找到了更方便好用的第二种途径
2. 利用自带的annonation 结合aop实现对方法的监控
首先对待监控的方法打上@Profiled的标注
	@Profiled(tag = "getMessage")
	public Object getMessage(int n , int sw){
		do biz ...

然后,把系统的aop 打开
	<!-- 使用annotation定义Asepct -->
    <aop:aspectj-autoproxy proxy-target-class="true" />
	<!-- 配置执行perf4j的Aspect -->
	<bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect" />

最后在log4j的配置文件中定义perf4j的appender 和logger
	<logger name="org.perf4j.TimingLogger" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="perf4jFileAppender"/>
    </logger>


    <appender name="perf4jFileAppender" class="org.apache.log4j.FileAppender">
        <param name="File" value="logs/perfStats.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p %c{2} - %m%n"/>
        </layout>
    </appender>

这样在getMessage方法在被调用时 ,将能够在日志中查到对应的响应时间信息,格式跟第一种方式的类似 。 看到这里, 肯定会有人要问, 这跟我通过切面对要监控的方法做System.currentTimeMillis() 有什么区别吗 ?其实 ,之所以使用perf4j还因为它强大的报表功能 。
1. 它能够通过自身的logPaser对日志做分析,并形成报表, 在命令行输入
java -jar perf4j-0.9.13.jar perfStats.log (默认是以30秒为时间片对日志做分析)那么 ,将会格式化成如下报表
Performance Statistics   20:32:00 - 20:32:30
Tag      Avg(ms)         Min         Max     Std Dev       Count
getMessage 249.4           2         487       151.3          37
Performance Statistics   20:32:30 - 20:33:00
Tag      Avg(ms)         Min         Max     Std Dev       Count
getMessage 120           4            556       151.3          43

另外, perf4j 也能够通过配置类似CoalescingStatistics 的appender来自动解析日志并形成报表(即通过跟log4j的整合, 不需要手工运行生成报表命令,自动形成报表) 。可以注意下 CoalescingStatistics, JmxAttributeStatisticsAppender, GraphingStatisticsAppender 这三个元素 ,可以通过他们可以有很多扩展的功能可以使用(包括tps 报表)

另外, 注意下 。 数据采样如果在线上当日常日志来处理的话, 担心对性能造成一定的影响。 所以 ,将会通过jmx 的形式来控制perf4j的开关。 举个例子 ,当我需要采样时 ,通过jmx 修改perf4j 的logger 的日志级别来达到 。特别指出 , 在JmxAttributeStatisticsAppender中perf4j是支持设置阙值的, 可以设定阙值来决定是否对jmx发送数据。

猜你喜欢

转载自google-go-hotmail-com.iteye.com/blog/1135801