歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

線上性能檢測工具之Btrace

當系統運行後,有的方法的執行時間讓人不滿意,需要用一些工具去查看執行的情況,可以考慮使用Btrace,使用還是比較簡單的。

1、安裝

首先到網上下個Btrace包吧,官方網址是:http://kenai.com/projects/btrace

解壓後,把bin目錄加入到環境變量中就可以使用了。

2、驗證

配置環境變量後,打開一個CMD控制台:

輸入命令 btrace:

Microsoft Windows [版本 6.1.7601]

版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。

 

C:\Users\fan>btrace

Usage: btrace <options> <pid> <btrace source or .classfile> <btrace arguments>

where possible options include:

  -classpath <path> Specifywhere to find user class files and annotation processors

  -cp <path>        Specify where to find user class filesand annotation processors

  -I <path>        Specify where to find include files

  -p <port>        Specify port to which the btrace agentlistens for clients

 

配置就完成了。

3、開發

btrace安裝好了,可以到btrace的官方幫助文檔中去看語法http://kenai.com/projects/btrace/pages/UserGuide

 

寫btrace腳本和一般的java差別不大,只是用了一些annotation來標識某個類是跟蹤腳本。btrace用到的jar包基本都在下載的/btrace-bin/build文件下,將這三個包導進工程就可以使用了。【btrace腳本寫好後可以不用編譯,直接執行.java文件就可以】

 

看一個trace的例子。

package com.btrace;

 

import java.util.Random;

import java.util.Arrays;

/**

 * 簡單的Btrace查看的示例,主要是方法的運行時間和內存使用

 * @author 范芳銘

 */

public class EasyBtraceTest {

      private Object[] elements;

      private int size = 0;

      private static final intDEFAULT_INI_CAPACITY = 16;

     

      public byte[] placeHolder =new byte[64 * 1024]; //占位符

      public EasyBtraceTest(){

              elements = new Object[DEFAULT_INI_CAPACITY];

      }

     

      public static voidmain(String[] args) throws Exception {

              while (true) {

                    Random random =new Random();

                    execute(random.nextInt(4000));

              }

 

      }

 

      public static Integerexecute(int sleepTime) {

              try {

                    Thread.sleep(sleepTime);

                    if (sleepTime %2 == 0){

                            System.out.println("正在執行");

                            EasyBtraceTesttest = new EasyBtraceTest();

                            test.push(test);

                    }

              } catch (Exception e) {

              }

              System.out.println("sleeptime is=>" + sleepTime);

              return 0;

      }

     

      //用於占用內存

      public void push(Object e){

              if (elements.length ==size )

                    elements=Arrays.copyOf(elements, 2 * size + 1 );

              elements[size++] = e;

      }

}

4、btrace腳本

我要監控execute方法執行的時間,以及使用的內存的情況

 

 btrace腳本如下:

package com.btrace;

 

import static com.sun.btrace.BTraceUtils.println; 

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.BTraceUtils.Sys;

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.OnTimer;

import com.sun.btrace.annotations.ProbeClassName; 

import com.sun.btrace.annotations.ProbeMethodName; 

import com.sun.btrace.annotations.TLS;

@BTrace 

public class TraceEasyBtrace { 

     

    @TLS 

    private static long startTime =0; 

     

    @OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute") 

    public static voidstartMethod(){ 

        startTime =timeMillis(); 

    } 

     

    @OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute", location =@Location(Kind.RETURN)) 

    public static voidendMethod(){ 

        println(strcat("theclass method execute time=>", str(timeMillis()-startTime))); 

      println("-------------------------------------------"); 

    } 

     

    @OnMethod(clazz ="com.btrace.EasyBtraceTest", method = "execute", location =@Location(Kind.RETURN)) 

    public static voidtraceExecute(@ProbeClassName String name,@ProbeMethodName String method,intsleepTime){ 

        println(strcat("theclass name=>", name)); 

        println(strcat("the classmethod=>", method)); 

        println(strcat("theclass method params=>", str(sleepTime))); 

         

    } 

   

    @OnTimer(4000)

    public static void printMem() {

        println("Heap:");

      println(Sys.Memory.heapUsage());

      println("Non-Heap:");

      println(Sys.Memory.nonHeapUsage());

    }

上面源碼有幾點注意的:

1、 @BTrace 這個annotation表明這個類是btrace腳本,

2、@OnMethod(clazz = " com.btrace.EasyBtraceTest ",method = "execute")

中clazz標明要監控那個類,也可以用正則匹配的方式,method標明要監控類的哪個方法

 

5、運行和具體使用

代碼寫好了,將EasyBtraceTest程序跑起來,看到每個幾秒控制台就會有信息輸出:

sleep time is=>3774

sleep time is=>1883

sleep time is=>3863

….

說明程序已經在跑了。

用TraceEasyBtrace.java這個腳本來監控EasyBtraceTest

前提條件:

兩個目錄:

TraceEasyBtrace.java  所在的目錄,在D:\develop\eclipse\work\performance\src\com\btrace下

JAVA的bin目錄下,用JPS查看進程id(應用每次運行可能都會變動,要在本機運行)

我的目錄在:

C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin

 

獲得運行的JAVA的進程ID;

進入命令行:

Microsoft Windows [版本 6.1.7601]

版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。

 

C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin

 

C:\Program Files\Java\jdk1.6.0_25\bin>jps

7364 EasyBtraceTest

2268

5392

6816 Jps

 

C:\Program Files\Java\jdk1.6.0_25\bin>

 

其中,7364 EasyBtraceTest 就是我們這個應用的PID。

這時候在TraceEasyBtrace.java 所在的目錄下運行命令btrace 7364 TraceEasyBtrace.java,結果如下:

Microsoft Windows [版本 6.1.7601]

版權所有 (c) 2009 MicrosoftCorporation。保留所有權利。

 

C:\Users\fan>cd C:\Program Files\Java\jdk1.6.0_25\bin

 

C:\Program Files\Java\jdk1.6.0_25\bin>jps

7364 EasyBtraceTest

2268

5392

6816 Jps

 

C:\Program Files\Java\jdk1.6.0_25\bin>d:

 

D:\>cd D:\develop\eclipse\work\performance\src\com\btrace

 

D:\develop\eclipse\work\performance\src\com\btrace>btrace 7364TraceEasyBtrace.java

Heap:

init = 0(0K) used = 1005544(981K) committed = 5177344(5056K) max =66650112(65088K)

Non-Heap:

init = 12746752(12448K) used = 5666640(5533K) committed = 13303808(12992K)max = 100663296(98304K)

the class name=>com.btrace.EasyBtraceTest

the class method=>execute

the class method params=>3011

the class method execute time=>3012

-------------------------------------------

the class name=>com.btrace.EasyBtraceTest

the class method=>execute

the class method params=>2849

the class method execute time=>2850

 …

可以看到每當execute方法執行時,就會打印出一行信息。打印出了類名,方法名,參數,以及這個方法執行的時間。以及內存的使用情況;

這就是一個非常簡單的btrace監控,還可以用於數據庫執行語句的監控,多線程的監控,WebService的監控等。

Copyright © Linux教程網 All Rights Reserved