`
dengminhui
  • 浏览: 167280 次
  • 来自: ...
社区版块
存档分类
最新评论

如何检测线上代码的运行情况---BTrace使用分享

阅读更多

(1)你是否有时发现线上的代码运行效率不高,但却无法定位到底具体是哪一段代码?
(2)你是否有时在测试环境中苦苦测试,最后却发现测试环境和生产环境差距太大而导致测试结果不可信?
恭喜你,本文恰好符合你的需求。
 
1什么是BTrace
BTrace是sun推出的一款java性能监控工具,利用java agent 和 jvm attach技术来实现运行时java程序的跟踪和替换,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。BTrace的脚本是用纯java编写的,基于一套官方提供的annotation,使跟踪逻辑实现起来异常简单。详细信息可以参考:http://kenai.com/projects/btrace
 
2如何使用BTrace
(1)下载btrace包 http://kenai.com/projects/btrace/downloads/directory/releases。 目前最新的版本是1.2
(2).设置环境变量。
(3).定制自己需要的脚本,一般是自己写一个Java文件。
(4).jps命令查出需要监控的jvm pid。
(5).调用命令btrace <pid> <自己定制的脚本>  <输出文件> eg:btrace 3045 PrintExecuteTime.java > time.log

 

3 使用示例
本次我们是因为morgan中DefaultMemberService的updateActivedBaseSite方法效率非常低,在测试环境下,发现各个机器上差距很大,不能完全定位性能。从测试机器上的测试结果来看,初步怀疑有两个点的性能可能存在问题:
(1)进行数据库的update的操作
(2)Napoli发送消息
按照如下示例代码(监控时间):

 

import static com.sun.btrace.BTraceUtils.name;  
 import static com.sun.btrace.BTraceUtils.print;  
 import static com.sun.btrace.BTraceUtils.println;  
 import static com.sun.btrace.BTraceUtils.probeClass;  
 import static com.sun.btrace.BTraceUtils.probeMethod;  
 import static com.sun.btrace.BTraceUtils.str;  
 import static com.sun.btrace.BTraceUtils.strcat;  
 import static com.sun.btrace.BTraceUtils.timeMillis;  
   
 import com.sun.btrace.annotations.BTrace;  
 import com.sun.btrace.annotations.Kind;  
 import com.sun.btrace.annotations.Location;  
 import com.sun.btrace.annotations.OnMethod;  
 import com.sun.btrace.annotations.TLS;  
   
  /** 
  * 监控方法耗时 
  *  
  * @author jerry 
  */  
 @BTrace  
 public class PrintTimes {  
   
     /** 
      * 开始时间 
      */  
     @TLS  
     private static long startTime = 0;  
   
     /** 
      * 方法开始时调用 
      */  
     @OnMethod(clazz = "/com\\.jerry\\../", method = "/.+/")  
     public static void startMethod() {  
         startTime = timeMillis();  
     }  
   
     /** 
      * 方法结束时调用<br> 
      * Kind.RETURN这个注解很重要 
      */  
     @SuppressWarnings("deprecation")  
     @OnMethod(clazz = "/com\\.jerry\\../", method = "/.+/", location = @Location(Kind.RETURN))  
     public static void endMethod() {  
   
         print(strcat(strcat(name(probeClass()), "."), probeMethod()));  
         print("  [");  
         print(strcat("Time taken : ", str(timeMillis() - startTime)));  
         println("]");  
     }  
 }  
 

 

 

书写了附件中的测试代码MorganTraceTest.java,并在线上找了一台机器试验:btrace  <pid>  MorganTraceTest.java  >  time.log
截取其中一部分结果如附件中time.log,可以看到真正的数据库update方法占用时间相对是较少的,反而DefaultEventService.publishEvent(发napoli消息)占用时间较多,问题基本定位。
 
 
4使用时注意
(1)BTrace的功能远不止监控运行时间,还可以监控Annotation,内存等各种资源,大家可以更深入的研究。
(2)鉴于此监控对线上环境还是有些许影响的(虽然非常小),所以我们在监控时时分几次每次半小时,而没有长期一直开启。建议大家时候时还是小心比较好,并且把这作为排查的最后一个手段,而不是第一手段,毕竟线上环境直接影响到用户,进行保持线上环境问题,是每位工程师的责任。
 
 
 
以上信息,参考页面:http://www.iteye.com/topic/652653
 
其他详细参考资料请见:
BTrace 用户指南 http://kenai.com/projects/btrace/pages/UserGuide
BTrace 开发者指南 http://kenai.com/projects/btrace/pages/DeveloperGuide

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics