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("); 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}"))); ; }
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/
Tomcat(JVM)性能监控方法的更多相关文章
- jvm性能监控与故障处理工具
jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具 类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功 ...
- 第八章 JVM性能监控与故障处理工具(2)
注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...
- 在k8s集群中,利用prometheus的jmx_exporter进行tomcat的JVM性能监控,并用grafana作前端展示
查找了很多文档,没有完全达到我要求的, 于是,作了一定的调整,成现在这样. 操作步骤如下: 一,准备好两个文件. jmx_prometheus_javaagent-0.3.1.jar jmx_expo ...
- JVM性能监控
有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 这些问题在日常开发中可能被很多人忽 ...
- JVM性能监控与故障处理命令行工具
JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...
- Informix 11.5 SQL 语句性能监控方法及实现
我们知道,在数据库应用系统中,SQL 语句的性能好坏至关重要.如果 SQL 语句性能很差,可能会导致整个数据库应用系统的性能也非常差.那么,如何监控数据库系统中 SQL 语句的性能,导致 SQL 语句 ...
- Wordpress 网站搭建及性能监控方法详解!
前言 说到 Wordpress,大家往往想到的是博客,其实,如今的 WordPress 已经成为全球使用量最多的开源 CMS 系统.并且,如果你有一定的技术基础稍加改动,就可以搭建出新闻网站.企业网站 ...
- 第七章 JVM性能监控与故障处理工具(1)
1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所 ...
- jvm性能监控(3)-jdk自带工具 jps jstack jmap
一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id jstack 查看Java线程 jstack -l pid; 做thread dump ...
随机推荐
- xor方程组消元 UVA 11542 Square
题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- 线程---JDK查看线程
JDK和LINUX提供的查看当前运行的线程的工具: KILLkill -3 [pid]:线程相关信息会列在Console上JSTACKjstack [pid]:查看线程运行状况,如等锁,运行等JCON ...
- Cellular Automata编写历程
2016.10.14:完成大致框架编写,控制台下实现 取点方式:南北半球对称取点;同一半球同一经度相邻点之间弧长相等;同一纬度相邻点之间弧长相等;不同纬度的圆周长度不等 地图设定为球形 2016.10 ...
- Tomcat目录结构及Tomcat Server处理一个http请求的过程
http://blog.sina.com.cn/s/blog_62cb15980101jh9x.html 1.Tomcat的结构概述 Tomcat服务器是由一系列可配置的组件构成,其核心组件是 ...
- ACM: I Hate It 解题报告 - 线段树
I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- HDU 4741 Save Labman No.004(计算几何)
题目链接 抄的模版...mark一下. #include <iostream> #include <cstring> #include <cstdio> #incl ...
- 服务器端接受Json数据的绑定实现
1.在方法参数前加上JsonRead<T>的泛型特性 public ActionResult GetData([JsonRead(typeof(PostData))]PostData po ...
- Linux3.4内核 Yaffs2文件系统的移植
作者:李老师,华清远见嵌入式学院讲师. [实验目的] Yaffs2文件系统是嵌入式系统中常用到的一种文件系统,是也是移植Android所必须的.通过向FS_S5PC100平台移植Yaffs文件系统,了 ...
- Oracle函数解析
一:大小写控制函数 lower()函数:(此函数将全部的大写字母都可以变为小写字母) upper()函数:(将输入的字符串变为大写字母) initcap()函数:(将每个字符串的首字母大写) 二:字 ...