1. 程式人生 > >Tomcat(JVM)監控方法(轉帖)

Tomcat(JVM)監控方法(轉帖)

1、Tomcat自帶的監控頁面

     配置詳見Tomcat安裝配置監控一文,如圖所示為監控頁面:

      

 

      

 

2、LoadRunner編寫指令碼實現Tomcat監控

    採用編寫VuGen指令碼訪問Tomcat的Status頁面的方式獲取效能資料(利用了關聯和lr_user_data_point函式),本質上還是使用tomcat自帶的監控頁面,只是將監控結果加到LR的analysis中。具體步驟如下:

1)首先確保Tomcat中建立了必要許可權的使用者(編輯Tomcat的\conf目錄下的tomcat-users.xml檔案),然後在LoadRunner中編寫指令碼(根據不同版本的tomcat監控結果中的監控資料項會有些差別,根據情況更改指令碼):

複製程式碼

double atof (const char *string); 
extern char* strtok(char *token, const char *delimiter); 

CollectMetrics()
{
    int countP, countS, countF, countR, countK;
    int numValues;
    static int loggedVersionInfo = FALSE; 

    lr_save_string("127.0.0.1:8080", "ServerName");
    web_set_max_html_param_len("65536"); 

    web_set_user("admin", 
        "admin", 
        "{ServerName}");

    lr_start_transaction("monitor tomcat");

    web_reg_save_param("JVMFreeMemory",
        "LB=Free memory: ",
        "RB= MB",
        "Ord=1",
        LAST);

    web_reg_save_param("JVMTotalMemory",
        "LB=Total memory: ",
        "RB= MB",
        "Ord=1",
        LAST);

    web_reg_save_param("JVMMaxMemory",
        "LB=Max memory: ",
        "RB= MB",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPMaxThreads",
        "LB=Max threads: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPMinSpareThreads",
        "LB=Min spare threads: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPMaxSpareThreads",
        "LB=Max spare threads: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPCurrentSpareThreads",
        "LB=Current thread count: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPCurrentThreadBusy",
        "LB=Current thread busy: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPMaxProcessingTime",
        "LB=Max processing time: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPRequestCount",
        "LB=Request count: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPErrorCount",
        "LB=Error count: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPBytesReceived",
        "LB=Bytes received: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("HTTPBytesSent",
        "LB=Bytes sent: ",
        "RB= ",
        "Ord=1",
        LAST);

    web_reg_save_param("JKMaxThreads",
        "LB=Max threads: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKMinSpareThreads",
        "LB=Min spare threads: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKMaxSpareThreads",
        "LB=Max spare threads: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKCurrentSpareThreads",
        "LB=Current thread count: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKCurrentThreadBusy",
        "LB=Current thread busy: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKMaxProcessingTime",
        "LB=Max processing time: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKRequestCount",
        "LB=Request count: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKErrorCount",
        "LB=Error count: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKBytesReceived",
        "LB=Bytes received: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_save_param("JKBytesSent",
        "LB=Bytes sent: ",
        "RB= ",
        "Ord=2",
        LAST);

    web_reg_find("Text=/manager", 
        LAST);

    web_url("status", 
        "URL=http://{ServerName}/manager/status", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t1.inf", 
        "Mode=HTTP", 
        LAST);

    lr_end_transaction("monitor tomcat", LR_AUTO);

    // 寫入Tomcat JVM 度量資料
    lr_user_data_point("Tomcat JVM Free memory", atof(lr_eval_string("{JVMFreeMemory}")));
    lr_user_data_point("Tomcat JVM Total memory", atof(lr_eval_string("{JVMTotalMemory}")));
    lr_user_data_point("Tomcat JVM Max memory", atof(lr_eval_string("{JVMMaxMemory}")));

    // 寫入Tomcat web server 度量資料
    lr_user_data_point("Tomcat HTTP Max threads", atof(lr_eval_string("{HTTPMaxThreads}")));
    lr_user_data_point("Tomcat HTTP Min spare threads", atof(lr_eval_string("{HTTPMinSpareThreads}")));
    lr_user_data_point("Tomcat HTTP Max spare threads", atof(lr_eval_string("{HTTPMaxSpareThreads}")));
    lr_user_data_point("Tomcat HTTP Current spare threads", atof(lr_eval_string("{HTTPCurrentSpareThreads}")));
    lr_user_data_point("Tomcat HTTP Current thread busy", atof(lr_eval_string("{HTTPCurrentThreadBusy}")));
    lr_user_data_point("Tomcat HTTP Max processing time", atof(lr_eval_string("{HTTPMaxProcessingTime}")));
    lr_user_data_point("Tomcat HTTP Request count", atof(lr_eval_string("{HTTPRequestCount}")));
    lr_user_data_point("Tomcat HTTP Error count", atof(lr_eval_string("{HTTPErrorCount}")));
    lr_user_data_point("Tomcat HTTP Bytes received", atof(lr_eval_string("{HTTPBytesReceived}")));
    lr_user_data_point("Tomcat HTTP Bytes sent", atof(lr_eval_string("{HTTPBytesSent}")));

    // 寫入Tomcat servlet container 度量資料
    lr_user_data_point("Tomcat JK Max threads", atof(lr_eval_string("{JKMaxThreads}")));
    lr_user_data_point("Tomcat JK Min spare threads", atof(lr_eval_string("{JKMinSpareThreads}")));
    lr_user_data_point("Tomcat JK Max spare threads", atof(lr_eval_string("{JKMaxSpareThreads}")));
    lr_user_data_point("Tomcat JK Current spare threads", atof(lr_eval_string("{JKCurrentSpareThreads}")));
    lr_user_data_point("Tomcat JK Current thread busy", atof(lr_eval_string("{JKCurrentThreadBusy}")));
    lr_user_data_point("Tomcat JK Max processing time", atof(lr_eval_string("{JKMaxProcessingTime}")));
    lr_user_data_point("Tomcat JK Request count", atof(lr_eval_string("{JKRequestCount}")));
    lr_user_data_point("Tomcat JK Error count", atof(lr_eval_string("{JKErrorCount}")));
    lr_user_data_point("Tomcat JK Bytes received", atof(lr_eval_string("{JKBytesReceived}")));
    lr_user_data_point("Tomcat JK Bytes sent", atof(lr_eval_string("{JKBytesSent}")));

    return 0;
}

複製程式碼

 

2)然後在Run-time中設定資料收集的間隔:

      

3)最後在Controller中設定指令碼執行,這樣場景執行完畢後,即可在Analysis中新增“User Defined Data Points”檢視收集到的Tomcat效能資料:

      

     這種收集資料的弊端是需要通過網路請求Tomcat的頁面,會對Tomcat伺服器的效能造成一定的影響如果Tomcat出現效能瓶頸,則收集資料時也可能碰到連線錯誤,因此,最好把收集資料點的間隔設大一點,例如5秒~10秒收集一個數據點。或儘量不採用LR監控。

 

3、JConsole監控

     JMX(Java Management Extensions)是一個為應用程式植入管理功能的框架。JMX是一套標準的代理和服務,實際上,使用者可以在任何Java應用程式中使用這些代理和服務實現管理。可以利用JDK的JConsole來訪問Tomcat JMX介面實施監控,具體步驟如下:

1)首先,開啟Tomcat5的bin目錄中的catalina.bat檔案,新增:

JAVA_OPTS="-Xms512m -Xmx512m -Xmn256m  -XX:PermSize=64m -XX:MaxPermSize=64m  -Djava.rmi.server.hostname=192.168.222.132 -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

-Dcom.sun.management.jmxremote:代表開啟JMX的管理功能
 

2)重啟tomcat,並檢視監控埠(上面配置的1090)是否已啟動

3)開啟jdk的bin目錄(如C:\Program Files\Java\jdk1.7.0_17\bin)下的JConsole,並輸入iP和監控埠進行連線

     

 

監控結果:

     

 

資料:

在Java SE 6中監視和診斷效能問題:http://www.ibm.com/developerworks/cn/java/j-java6perfmon/

 

4、VisualVM監控 

    VisualVM(All-in-One Java Trubleshooting Tool)是目前為止隨JDK釋出(在JDK1.6 update7中首次出現)的功能最強大的執行監視和故障處理程式,相對JProfiler、YourKit等專業收費工具最大的優點:不需要被監視的程式基於特殊Agent執行,它對應用程式實際效能影響很小,可以直接應用在生產環境中。

    VisualVM基於NetBean平臺開發,支援外掛擴充套件,可以做到:

      

資料:

使用VisualVM進行效能分析及調優:http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

 

5、LambdaProbe監控

      LambdaProbe是一款強大的免費開源工具,LambdaProbe擁有幾乎所有Tomcat Manager的功能, 可以說是一個增強版本的Tomcat Manager。除此之外,Tomcat Probe 還擁有很多讓開發者和系統管理者更方便的功能,從而使得Tomcat對開發者和管理者更加透明,包括:應用程式,資料來源,釋出,日誌,執行緒,叢集,系統資訊,狀態,聯結器狀態等功能。

1)下載LambdaProbe

2)解壓probe.1.7b.zip檔案,把probe.war部署到Tomcat伺服器,修改tomcat-users.xml檔案,新增賬戶許可權:

 

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="probe" password="probe" roles="admin,manager"/>
</tomcat-users>

複製程式碼

3)設定tomcat啟動引數
# vi  ../bin/catalina.sh 
JAVA_OPTS=-Dcom.sun.management.jmxremote

4)重啟動Tomcat伺服器

5)訪問http://serverip/probe/,輸入使用者名稱和密碼,進入即可對tomcat及jvm進行監控

6)漢化方法:將messages_zh_CN.zip檔案解壓縮, 將其中的 messages_zh_CN.properties 放到 $TOMCAT_HOME$\webapps\probe\WEB-INF 下即可

目前配置到第5步時訪問遇到如下所示的問題

       

問題原因:

    Porbe只支援Tomcat伺服器的版本: 5.0, 5.5, 6.0,而不支援更高版本,如7.0

解決方案:

    從7.0換成6.0版本的tomcat即可:

     

 

6、JProfiler監控

      JProfiler是一款Java的效能監控工具。可以檢視當前應用的物件、物件引用、記憶體、CPU使用情況、執行緒、執行緒執行情況(阻塞、等待等),同時可以查詢應用記憶體使用得熱點,即:哪個物件佔用的記憶體比較多;或者CPU熱點,即:哪兒方法佔用的較大得CPU資源。 

1)將jprofiler_linux_7_2_3.tar.gz上傳至Linux伺服器,解壓縮至opt目錄下:

      

 2)在客戶端windows上安裝jprofiler並開啟:

     

3)依次按嚮導安裝即可:

     

     選擇遠端連線:

     

     根據遠端平臺型別選擇:

     

     選擇JVM版本、位數等:

     

     

     待監控的遠端伺服器IP地址和Jprofiler監聽的埠號(預設8864):

     

     

4)到此步驟時,如下引數需要新增到伺服器端的JVM啟動引數中:

    

    

 

5)重啟伺服器端Tomcat服務

6)完成客戶端遠端連線:

     

     

     大功告成:

      

資料:

JProfiler解決Java伺服器的效能跟蹤:http://www.blogjava.net/anymobile/articles/28248.html

常用Java Profiling工具的分析與比較:http://www.ibm.com/developerworks/cn/java/j-lo-profiling/