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/