renshanshan 发表于 2015-8-9 07:52:04

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;
}
View Code  
  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文件,添加账户权限:









  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/
  
页: [1]
查看完整版本: Tomcat(JVM)性能监控方法