LoadRunner监控Tomcat的几种方法

上一篇 / 下一篇  2013-07-31 14:01:05 / 个人分类:应用

通过JConsole监控Tomcat

1、打开tomcat5的bin目录中的catalina.bat文件,在头部注释部分的后面加上:

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 2、修改JMX远程访问授权。

进入JAVA安装目录的\jre6\lib\management目录,把jmxremote.password.template文件改名为jmxremote.password,去掉最后两行的注释(用户名和密码): monitorRole QED controlRole R&D

确保jmxremote.access文件末尾的访问角色没有被注释掉: monitorRole readonly controlRole readwrite \

create javax.management.monitor.*,javax.management.timer.* \ unregister

然后分别选择这两个文件,点右键“属性”-〉安全,点“高级”,去掉“从父项继承....”,弹出窗口中选“删除”,这样删除了所有访问权限。再选“添加”-〉高级,“立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限窗口,勾选"完全控制",点"确定" 注:JDK好像需要装在NTFS文件系统下才行 3、启动Tomcat

4、在命令行输入netstat -an 查看端口8999是否已经打开,如果没有,则是前面的配置没配好。 5、如果已经配置好,则在命令行输入jconsole,打开jdk自带的JMX客户端,选择远程连接,录入tomcat所在机器的IP,端口例192.168.1.100:8999,帐号、密码在jmxremote.password中,如帐号controlRole,密码R&D(缺省monitorRole只能读,controlRole能读写,jmxremote.access中可配置)。点“连接”。

编写JAVA程序收集Tomcat性能数据

import java.util.Set;

import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo;

import javax.management.MBeanServerConnection; import javax.management.ObjectInstance; import javax.management.ObjectName;

import javax.management.openmbean.CompositeDataSupport; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL;

public class MonitorTomcat { /**

* @param args */

public static void main(String[] args) { try {

String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.1.100:8999/jmxrmi";//tomcat jmx url

JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

Map map = new HashMap();

String[] credentials = new String[] { "monitorRole" , "QED" }; map.put("jmx.remote.credentials", credentials);

JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map); MBeanServerConnection mbsc = connector.getMBeanServerConnection();

//端口最好是动态取得

ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080"); MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);

String attrName = "currentThreadCount";//tomcat的线程数对应的属性值 MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();

System.out.println("currentThreadCount:"+mbsc.getAttribute(threadObjName, attrName)); //heap

for(int j=0;j <mbsc.getDomains().length;j++){

System.out.println("###########"+mbsc.getDomains()[j]); }

Set MBeanset = mbsc.queryMBeans(null, null);

System.out.println("MBeanset.size() : " + MBeanset.size());

Iterator MBeansetIterator = MBeanset.iterator(); while (MBeansetIterator.hasNext()) {

ObjectInstance bjectInstance = (ObjectInstance)MBeansetIterator.next(); ObjectName bjectName = objectInstance.getObjectName(); String canonicalName = objectName.getCanonicalName(); System.out.println("canonicalName : " + canonicalName);

if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) { // Get details of cluster MBeans

System.out.println("Cluster MBeans Details:");

System.out.println("========================================="); //getMBeansDetails(canonicalName);

String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString(); } }

//------------------------- system ----------------------

ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");

System.out.println("厂商:"+ (String)mbsc.getAttribute(runtimeObjName, "VmVendor")); System.out.println("程序:"+ (String)mbsc.getAttribute(runtimeObjName, "VmName")); System.out.println("版本:"+ (String)mbsc.getAttribute(runtimeObjName, "VmVersion")); Date starttime=new Date((Long)mbsc.getAttribute(runtimeObjName, "StartTime")); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("启动时间:"+df.format(starttime));

Long timespan=(Long)mbsc.getAttribute(runtimeObjName, "Uptime");

System.out.println("连续工作时间:"+MonitorTomcat.formatTimeSpan(timespan)); //------------------------ JVM ------------------------- //堆使用率

ObjectName heapObjName = new ObjectName("java.lang:type=Memory");

MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));

long maxMemory = heapMemoryUsage.getMax();//堆最大

long commitMemory = heapMemoryUsage.getCommitted();//堆当前分配 long usedMemory = heapMemoryUsage.getUsed();

System.out.println("heap:"+(double)usedMemory*100/commitMemory+"%");//堆使用率

MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));

long noncommitMemory = nonheapMemoryUsage.getCommitted(); long nonusedMemory = heapMemoryUsage.getUsed();

System.out.println("nonheap:"+(double)nonusedMemory*100/noncommitMemory+"%");

ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen"); MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(permObjName, "Usage"));

long committed = permGenUsage.getCommitted();//持久堆大小 long used = heapMemoryUsage.getUsed();//

System.out.println("perm gen:"+(double)used*100/committed+"%");//持久堆使用率

//-------------------- Session ---------------

ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*"); Set<ObjectName> s=mbsc.queryNames(managerObjName, null); for (ObjectName obj:s){

System.out.println("应用名:"+obj.getKeyProperty("path")); ObjectName bjname=new ObjectName(obj.getCanonicalName());

System.out.println("最大会话数:"+ mbsc.getAttribute( objname, "maxActiveSessions"));

System.out.println("会话数:"+ mbsc.getAttribute( objname, "activeSessions")); System.out.println("活动会话数:"+ mbsc.getAttribute( objname, "sessionCounter")); }

//----------------- Thread Pool ----------------

ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*"); Set<ObjectName> s2=mbsc.queryNames(threadpoolObjName, null); for (ObjectName obj:s2){

System.out.println("端口名:"+obj.getKeyProperty("name")); ObjectName bjname=new ObjectName(obj.getCanonicalName());

System.out.println("最大线程数:"+ mbsc.getAttribute( objname, "maxThreads")); System.out.println("当前线程数:"+ mbsc.getAttribute( objname, "currentThreadCount"));

System.out.println("繁忙线程数:"+ mbsc.getAttribute( objname, "currentThreadsBusy")); }

} catch (Exception e) { e.printStackTrace(); } }

public static String formatTimeSpan(long span){ long minseconds = span % 1000;

span = span /1000; long seconds = span % 60;

span = span / 60; long mins = span % 60;

span = span / 60;

记录的数据:

currentThreadCount:150 ###########JMImplementation ###########Users

###########com.sun.management ###########Catalina ###########java.lang ###########java.util.logging MBeanset.size() : 383

canonicalName : Catalina:name=HttpRequest152,type=RequestProcessor,worker=http-8080 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/jsp-examples,j2eeType=Servlet,name=org.apache.jsp.jsp2.el.basic_002dcomparisons_jsp ……

canonicalName : Catalina:port=8009,type=Mapper

canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/jsp-examples,j2eeType=Servlet,name=org.apache.jsp.dates.date_jsp 厂商:Sun Microsystems Inc. 程序:Java HotSpot(TM) Client VM 版本:11.3-b02

启动时间:2010-02-09 11:36:59 连续工作时间:0天 00:13:55.775 heap:62.221410820735% nonheap:84.59782727899399% perm gen:210.93058268229166%

应用名:/jsp-examples 最大会话数:-1 会话数:0 活动会话数:0 应用名:/ 最大会话数:-1 会话数:0 活动会话数:0 应用名:/host-manager 最大会话数:-1 会话数:0 活动会话数:0 应用名:/tomcat-docs 最大会话数:-1 会话数:0 活动会话数:0 应用名:/AltoroJ 最大会话数:-1 会话数:301 活动会话数:301 应用名:/webdav 最大会话数:-1 会话数:0 活动会话数:0

应用名:/servlets-examples 最大会话数:-1 会话数:0 活动会话数:0 应用名:/manager 最大会话数:-1

会话数:0 活动会话数:0 应用名:/balancer 最大会话数:-1 会话数:0 活动会话数:0 端口名:http-8080 最大线程数:150 当前线程数:150 繁忙线程数:100 端口名:jk-8009 最大线程数:200 当前线程数:4 繁忙线程数:1

使用LR的lr_user_data_point函数

/*

<h1>JVM</h1><p> Free memory: 130.99 MB Total memory: 254.18 MB Max memory: 1016.12 MB</p> */

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); /*

<h1>http-8080</h1><p> Max threads: 150 Min spare threads: 25 Max spare threads: 75 Current thread count: 25 Current thread busy: 2<br> Max processing time: 78 ms Processing time: 0.124 s

Request count: 11 Error count: 3 Bytes received: 0.00 MB Bytes sent: 0.03 MB</p> */

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); /*

<h1>jk-8009</h1><p> Max threads: 200 Min spare threads: 4 Max spare threads: 50 Current thread count: 8 Current thread busy: 6

<br> Max processing time: 8031 ms Processing time: 199.1 s Request count: 11279 Error count: 426 Bytes received: 0.00 MB Bytes sent: 100.88 MB</p> */

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);

// Version Information /*

<table border="1" cellspacing="0" cellpadding="3"> <tr>

<td colspan="6" class="title">Server Information</td> </tr> <tr>

<td class="header-center"><small>Tomcat Version</small></td> <td class="header-center"><small>JVM Version</small></td> <td class="header-center"><small>JVM Vendor</small></td> <td class="header-center"><small>OS Name</small></td> <td class="header-center"><small>OS Version</small></td> <td class="header-center"><small>OS Architecture</small></td> </tr> <tr>

<td class="row-center"><small>Apache Tomcat/5.5.23</small></td> <td class="row-center"><small>1.5.0_15-b04</small></td>

<td class="row-center"><small>Sun Microsystems Inc.</small></td> <td class="row-center"><small>Windows 2003</small></td> <td class="row-center"><small>5.2</small></td> <td class="row-center"><small>x86</small></td> </tr> </table> */

web_reg_save_param("ServerTomcatVersion", "LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=1", LAST);

web_reg_save_param("ServerJVMVersion", "LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=2", LAST);

web_reg_save_param("ServerJVMVendor", "LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=3", LAST);

web_reg_save_param("ServerOSName",

"LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=4", LAST);

web_reg_save_param("ServerOSVersione", "LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=5", LAST);

web_reg_save_param("ServerOSArchitecture", "LB=<td class=\"row-center\"><small>", "RB=</small></td>", "Ord=6", LAST);

第12/16页

/*

// Determine number of threads in each state.

// P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive

web_reg_save_param("StageTable",

"LB=<table border=\"0\"><tr><th>Stage</th><th>Time</th><th>B Sent</th><th>B Recv</th><th>Client</th><th>VHost</th><th>Request</th></tr>", //<tr><th>Stage", //</th><th>Time</th><th>B Sent</th><th>B Recv</th><th>Client</th><th>VHost</th><th>Request</th></tr><tr>", "RB=</table>",

"Ord=All", // note that there should only be 2 tables in this test environment. 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 metrics

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 metrics

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("{HTTPMaxProcessing

第13/16页

Time}")));

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 metrics

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}")));

// Determine number of threads in each state.

// Note that there is some complexity in doing this (see code below)... // P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive

if (strcmp(lr_eval_string("{StageTable_count}"), "2") != 0) { // Verify that there are only two tables.

lr_error_message("Monitoring script. expected 2 tables of thread metrics, but instead found %s", lr_eval_string("{StageTable_count}"));

} else { // extract the P, S, F, R, and K values from both the tables.

// check that there are only 2 tables. Raise an error if there is not...

//lr_save_searched_string(const char *buffer, long buf_size, unsigned int occurrence, const char *search_string, int offset, unsigned int string_len, const char *parm_name ); // maybe should use strtok for this. //strtok

// lr_xml_get_values

lr_output_message("%s", lr_eval_string("{StageTable_1}")); numValues= lr_xml_get_values("XML={StageTable_1}",

第14/16页

使用SiteScope监控Tomcat

1、安装SiteScope

LR9.5的安装包中附带了SiteScope9.5的安装文件 \Additional Components\Sitescope\SiteScope 9.50 2、配置SiteScope

新建监视器,选择JMX类别

输入Tomcat的JMX URL地址,例如:

service:jmx:rmi:///jndi/rmi://192.168.1.100:8999/jmxrmi 用户名:monitorRole 密码:QED 添加计数器,例如:

java.lang/Memory/HeapMemoryUsage/used java.lang/Memory/HeapMemoryUsage/max Catalina/ThreadPool/jk-8010/currentThreadCount

第15/16页

Catalina/ThreadPool/jk-8010/maxSpareThreads Catalina/ThreadPool/jk-8010/minSpareThreads

然后就可以在LR的Controller中连接SiteScope对Tomcat进行监控


摘自百度文库


TAG: Tomcat tomcat 监控

 

评分:0

我来说两句

日历

« 2024-04-19  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 24491
  • 日志数: 18
  • 建立时间: 2013-07-16
  • 更新时间: 2015-04-17

RSS订阅

Open Toolbar