java监控性能问题分析工具java melody

java melody方便分析sql执行、cpu占用的等内容

1.  Web应用:待监控的web应用

2.  Javamelody.war:主要包含两个jar包

1.相关jar包的下载

这里使用的是Javamelody.zip,包含有javamelody.jar和jrobin-x.jar(这里的x表示版本号)。  

两个jar包需要拷贝到相应webapp的WEB-INF/lib目录下。

如果是使用Maven,可以将javamelody-core添加进pom.xml,建立依赖:

 

 
  1. <!--javamelody-core -->

  2.  
  3. <dependency>

  4.  
  5. <groupId>net.bull.javamelody</groupId>

  6.  
  7. <artifactId>javamelody-core</artifactId>

  8.  
  9. <version>1.65.0</version>

  10.  
  11. </dependency>

  12.  
  13. <!-- itext, option to add PDF export-->

  14.  
  15. <dependency>

  16.  
  17. <groupId>com.lowagie</groupId>

  18.  
  19. <artifactId>itext</artifactId>

  20.  
  21. <version>2.1.7</version>

  22.  
  23. <exclusions>

  24.  
  25. <exclusion>

  26.  
  27. <artifactId>bcmail-jdk14</artifactId>

  28.  
  29. <groupId>bouncycastle</groupId>

  30.  
  31. </exclusion>

  32.  
  33. <exclusion>

  34.  
  35. <artifactId>bcprov-jdk14</artifactId>

  36.  
  37. <groupId>bouncycastle</groupId>

  38.  
  39. </exclusion>

  40.  
  41. <exclusion>

  42.  
  43. <artifactId>bctsp-jdk14</artifactId>

  44.  
  45. <groupId>bouncycastle</groupId>

  46.  
  47. </exclusion>

  48.  
  49. </exclusions>

  50.  
  51. </dependency>

2.相关文件的配置

如果是存放的jar包,使用的servletAPI是3.0的,像tomcat7 glassfish v3 jboss6等等,那么就需要配置xml了需要对WEB-INF下的web.xml进行修改。 

 

 

 

 
  1. <filter>

  2.  
  3. <filter-name>monitoring</filter-name>

  4.  
  5. <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>

  6.  
  7. </filter>

  8.  
  9. <filter-mapping>

  10.  
  11. <filter-name>monitoring</filter-name>

  12.  
  13. <url-pattern>/*</url-pattern>

  14.  
  15. </filter-mapping>

  16.  
  17. <listener>

  18.  
  19. <listener-class>net.bull.javamelody.SessionListener</listener-class>

  20.  
  21. </listener>

 

 

同时,如果使用的是servlet3.0,还需要添加<async-supported>true</async-supported> 来支持异步请求

 

3.  监控页面

现在就可以启动应用服务器打开网址查看监控效果了。网址:http://<host>/<context>/monitoring

  1. <host>是web应用服务器的部署IP,通常是localhost:8080或者127.0.0.1:8080具体看你自己的应用服务器
  2. <context>是你的web应用的名字。
查阅资料发现缓存文件都存放在tomcat下的temp中了,目录是tomcat/temp/javamelody/应用名字_主机名字

4.  监控报告页面顶部

 

以上图为例,页面顶部主要内容如下:

  1. 监控起始时间:17-6-29 下午4:51
  2. 监控对象:PC-20170315ZAWI (goss webapp)
  3. 手动刷新
  4. 监控时间段设置:1天(天、周、月、年或自定义时间段最小时间段为1天)

5.  演变图

5.1 基本介绍

在监控页面首先显示了12副图,点击“其他的图”,可以显示隐藏的其他图。这些图都是记录的某一度量值在指定时间段(天、周、月、年或其他自定义时间段)内得时间演变过程。

所有的图展示的测量值如下显示:

  1. Java内存
  2. JavaCPU使用情况
  3.  用户Session数量
  4. JDBC连接数
  5. http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等

每一幅图都是持续存在的,即使重新启动服务器,也对它们没有影响。而且每幅图都可以通过点击,来单独查看,并调整大小显示。

如果监控的是集群内的多个服务器,那么内存的图表显示的是各服务器使用内存的总和,而CPU占用率则还是0-100%之间。像Session的数量、活动线程的数量、活动或已使用的JDBC连接数、每分钟的匹配数和平均时间就是各服务器的总和。

5.2 图表理解

内存演变图:

 

当服务器正在使用,那么图中的内存值就会迅速增加。如果出现服务器没有使用,但内存值仍然增加,通常是因为垃圾回收器没有回收内存。如果需要立即释放,可以使用“系统消息”中的强制执行垃圾回收。

常见问题:

内存增到最大值,无法GC,服务器报“OutOfMemoryErrors:Java堆空间”,来中断执行并尽可能释放内存。在内存被释放之前,CPU占用会一直保持100%,这可能会让服务器极度缓慢或者堵塞。

解决办法:

可以通过增加设置的Java内存(服务器配置参数Xmx),以及可能的服务器物理内存,当然最好还是能够优化应用使用的内存,减少使用。

 

常见问题:

如果持久化内存已满,而且应用程序无法释放,会报“OutOfMemoryErrors:PermGen空间”并中断执行,这可以阻止应用的所有功能。

解决办法:

可以通过增加最大PermGen内存,以及可能的物理内存,或者尽量减少应用程序加载的类的数量。

 

JDBC连接图和活动线程图:

 

当应用程序稀疏或者不用时,活动线程和jdbc连接图基本保持为0。而大多数请求都很短,大多数测量(例如,每2分钟完成一次)在没有活动请求的情况下进行,除了1或2偶尔表现为高峰,其他基本为0。

如果活动线程图可能出现一段平坦的直线,这就意味着当前存在一个或多个长请求,这可能使服务器或者数据库饱和。

如果这时,jdbc连接中出现相同平直线段,那么就意味着这时存在的是一个或多个SQL请求,而不是执行java代码。

对于长请求,如果正在持续,可以在当前请求表中查询获得;如果已经结束,可以在http和sql请求的“描述”中获得。

 

JDBC图:

 

活动的jdbc连接图,显示运行的sql查询的连接数;而已使用的jdbc连接图,显示与数据库的事务中使用单未必执行sql查询的已打开的连接数。

如果服务器在没有活动时,连接图的连接数量仍然增加,那么就意味着应用存在JBDC连接泄露。如果怀疑连接泄漏,可以在“系统信息”中的“打开的jdbc连接”,显示连接打开位置的时间和堆栈跟踪。

6.  统计信息

6.1 请求统计

         系统每统计完一个请求的信息,就会显示一个请求。每个请求统计表都按照警报级别划分了三类:所有请求(global)、警告(warning)和严重(Severe)。而且都可以通过右下角的“描述”查看具体的请求详细信息。

所有请求的种类有:

  1. Http统计
  2. sql 统计(jdbc)
  3. Ejb统计(如果ejb3在JavaEE 5+上发布)
  4. Spring统计(如Spring)
  5. Guice统计(如果guicefa ades)统计界面(没有ejb3,Spring或gu ice)
  6. jsf动作的统计
  7. struts操作统计使用jsp页面(或更准确地说,在httpServletRequest.getRequestDispatcher上执行include或forward的统计信息,这些是一般的jsp页面)

请求图表均包含一下字段:

  1. 请求
  2. 总的累计时间
  3. 点击
  4. 平均时间
  5. 最大时间
  6. 标准偏差
  7. 积累的CPU时间
  8. 平均CPU使用时间
  9. 系统错误

这里包含Http统计表、SQL统计表、JSP统计表,

6.2 系统错误

 

Http系统错误:

显示250个最常见的错误信息列表,以http错误代码来标识。

系统错误日志:

应用程序写入的“警告”和“严重”日志。显示了500个最常见的错误日志列表。

两表显示了所选时间段内的个案数量和平均请求时间等信息,详细的信息可以查看“描述”,“最后的错误”显示最后一百个错误。通过单击错误日志名称,当错误是Java异常时,可以看到Java stack-trace错误。

6.3 当前请求

 

该表显示当前系统正在执行的请求,最初只显示最长的请求,通过点击“+详细信息”链接显示其他请求。

如果系统出现错误,通常会伴随某些请求无法完成,在这里可以找到未能完成的请求信息,有助于确定系统出错位置。

6.4 系统信息

         系统信息在生成报告时显示有关java服务器、状态和服务器操作系统上的一些信息。最初以文字的形式展示java内存、http会话、CPU占用率等信息,这里的信息与最开始的演变图信息保持一致。

       同时这里还包含一些系统操作链接,可以用来在监控发现问题时进行查询、验证或者解决问题。

具体操作如下:

  1. “执行垃圾收集器”,强制释放内存
  2. “生成堆转储”,将所有内容转储到服务器上的临时目录的文件中,您可以使用JDK的VisualVM或Eclipse MAT
  3. '查看内存直方图',显示每个java类的内存中的实例数
  4. “无效http会话”,强制所有用户断开连接
  5.  “查看http会话”,查看属性,序列化大小(通常高于内存大小),国家和每个会话的用户(如果通过JavaEE进行身份验证)
  6.  '查看部署描述符':应用程序的web.xml文件
  7.  “MBeans”:管理bean,如jconsole或jvisualvm,在应用程序服务器和JVM上有一些配置和技术数据。这些值是可见的,但不可写,无法执行操作。
  8. “查看操作系统进程”:操作系统进程列表(具有ps或Windows的任务列表的linux)和每个进程的用户,内存和CPU
  9.  'JNDI tree':浏览JNDI上下文,例如查找JDBC数据源的路径和名称。为了帮助找到可能的jdbc连接泄漏
  10. '打开的jdbc连接'显示打开jdbc连接的位置的堆栈跟踪列表。
  11. “数据库”:数据库的信息和统计信息(如果PostgreSQL,MySQL,Oracle,DB2,Sybase或H2),例如当前的sql请求或者oracle是累积时间中最长的请求,显示cpu时间和缓冲区的基本成本()获得。如果在应用程序中配置的连接到数据库的用户没有必要的权限,此功能将显示错误

6.5 线程信息

此表显示服务器中所有线程的列表,在“描述”中还包括每个优先级,工具提示中的状态和堆栈跟踪等。

7.  总结

    Javamelody对于服务器的监控包含许多方面,初看会觉得信息过多,有些冗杂。我们首先需要了解监控信息显示页面各部分的含义,然后根据需要查看不同部分。

如果需要了解服务器大体运行状态,可以重点演变图,这样可以观察到随时间变化各数据的变化趋势。想看数字信息,可以直接阅读系统信息部分。如果观察到图表均匀变化,通常说明系统运行正常,观察CPU占用率和内存占用可以知道当天哪些时段系统运行频繁、负载很大。

如果需要关注系统异常,可以在观察完演变图后,直接查看系统错误部分。查看http系统异常与系统日志异常可以快速了解系统出现的错误的信息。想了解详细信息,可以查看 “描述”。

    请求统计部分可以粗略的显示出系统异常出现的频率,还可以详细的展示各种请求的平均时长。了解系统各部分时间消耗,这里可以重点关注。

    各部分的信息需要结合服务器,如果想要更高效的使用,需要积累更多经验。监控平台不仅提供了信息显示,也提供了一些操作,在“系统信息”部分,可以使用一些操作解决部分问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值