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)性能监控方法的更多相关文章

  1. jvm性能监控与故障处理工具

    jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具  类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功 ...

  2. 第八章 JVM性能监控与故障处理工具(2)

    注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...

  3. 在k8s集群中,利用prometheus的jmx_exporter进行tomcat的JVM性能监控,并用grafana作前端展示

    查找了很多文档,没有完全达到我要求的, 于是,作了一定的调整,成现在这样. 操作步骤如下: 一,准备好两个文件. jmx_prometheus_javaagent-0.3.1.jar jmx_expo ...

  4. JVM性能监控

    有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 这些问题在日常开发中可能被很多人忽 ...

  5. JVM性能监控与故障处理命令行工具

    JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...

  6. Informix 11.5 SQL 语句性能监控方法及实现

    我们知道,在数据库应用系统中,SQL 语句的性能好坏至关重要.如果 SQL 语句性能很差,可能会导致整个数据库应用系统的性能也非常差.那么,如何监控数据库系统中 SQL 语句的性能,导致 SQL 语句 ...

  7. Wordpress 网站搭建及性能监控方法详解!

    前言 说到 Wordpress,大家往往想到的是博客,其实,如今的 WordPress 已经成为全球使用量最多的开源 CMS 系统.并且,如果你有一定的技术基础稍加改动,就可以搭建出新闻网站.企业网站 ...

  8. 第七章 JVM性能监控与故障处理工具(1)

    1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所 ...

  9. jvm性能监控(3)-jdk自带工具 jps jstack jmap

    一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id   jstack 查看Java线程      jstack -l pid; 做thread dump ...

随机推荐

  1. sql in(1,2,3)参数化查询,错误在将 varchar 值 '1,2,3,4' 转换成数据类型 int 时失败

    解决办法 string userIds = "1,2,3,4";using (SqlConnection conn = new SqlConnection(connectionSt ...

  2. Oracle 查询性能优化实践

      1.索引使用原则   不要对索引使用全模糊,但是 LIKE 'asdf%'是可以的,即不要Contains,可用StartWith 不要对索引进行函数,表达式操作,或者使用is null判断,否则 ...

  3. web工程spring+ibatis单元测试

    web工程spring+ibatis在本地做单元测试,用例如下: package wanghongye; import org.junit.Before; import org.junit.Test; ...

  4. BZOJ4568 : [Scoi2016]幸运数字

    树的点分治,每次求出重心后,求出重心到每个点路径上的数的线性基. 对于每个询问,只需要暴力合并两个线性基即可. 时间复杂度$O(60n\log n+60^2q)$. #include<cstdi ...

  5. BZOJ2164 : 采矿

    树链剖分+线段树,每个节点维护以下信息: (1)单独在某个点分配$i$个人的最大收益.可以$O(m)$合并. (2)分配$i$个人的最大收益.可以用$O(m^2)$合并. 时间复杂度$O(c(m^2\ ...

  6. [深入浅出WP8.1(Runtime)]应用文件的URI方案

    6.2.4 应用文件的URI方案 在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地 ...

  7. 手机web站点和手机app 技术选型的困惑于思考

    今年一直在关注移动端技术的发展,自己也用博客园的rss接口玩了半年,关于技术选型的困惑和大家说说 一 趋势 随着手机硬件不断的升级,外加4g牌照的发放,不出2年时间移动端web站点和手机app一定会进 ...

  8. HDU 4753 Fishhead’s Little Game(DFS)

    题目链接 很繁琐的爆搜,最多要加2^12条边,暴力就可以,回溯那部分一直没有回溯好,写了一晚上...代码非常,非常难看..对了,还不是普通的爆搜,双向搜索博弈,以前记得看过,这次好像第一次写.. #i ...

  9. [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?

    [IBM DB2] db2 terminate 和 db2 connect reset 有什么区别?  总结:如果是退出编辑器 quit :如果是断开数据库连接释放资源 connect reset : ...

  10. HTML5中video 和 ogg

    HTML5中 的ogg 从网上学习HTML5之video时看到了下面的代码,不太清楚ogg是什么,于是搜索了一些知识点供了解.