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,建立依赖:
-
<!--javamelody-core -->
-
<dependency>
-
<groupId>net.bull.javamelody</groupId>
-
<artifactId>javamelody-core</artifactId>
-
<version>1.65.0</version>
-
</dependency>
-
<!-- itext, option to add PDF export-->
-
<dependency>
-
<groupId>com.lowagie</groupId>
-
<artifactId>itext</artifactId>
-
<version>2.1.7</version>
-
<exclusions>
-
<exclusion>
-
<artifactId>bcmail-jdk14</artifactId>
-
<groupId>bouncycastle</groupId>
-
</exclusion>
-
<exclusion>
-
<artifactId>bcprov-jdk14</artifactId>
-
<groupId>bouncycastle</groupId>
-
</exclusion>
-
<exclusion>
-
<artifactId>bctsp-jdk14</artifactId>
-
<groupId>bouncycastle</groupId>
-
</exclusion>
-
</exclusions>
-
</dependency>
2.相关文件的配置
如果是存放的jar包,使用的servletAPI是3.0的,像tomcat7 glassfish v3 jboss6等等,那么就需要配置xml了需要对WEB-INF下的web.xml进行修改。
-
<filter>
-
<filter-name>monitoring</filter-name>
-
<filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
-
</filter>
-
<filter-mapping>
-
<filter-name>monitoring</filter-name>
-
<url-pattern>/*</url-pattern>
-
</filter-mapping>
-
<listener>
-
<listener-class>net.bull.javamelody.SessionListener</listener-class>
-
</listener>
同时,如果使用的是servlet3.0,还需要添加<async-supported>true</async-supported> 来支持异步请求
3. 监控页面
现在就可以启动应用服务器打开网址查看监控效果了。网址:http://<host>/<context>/monitoring
-
<host>是web应用服务器的部署IP,通常是localhost:8080或者127.0.0.1:8080具体看你自己的应用服务器
-
<context>是你的web应用的名字。
查阅资料发现缓存文件都存放在tomcat下的temp中了,目录是tomcat/temp/javamelody/应用名字_主机名字
4. 监控报告页面顶部
以上图为例,页面顶部主要内容如下:
- 监控起始时间:17-6-29 下午4:51
- 监控对象:PC-20170315ZAWI (goss webapp)
- 手动刷新
- 监控时间段设置:1天(天、周、月、年或自定义时间段最小时间段为1天)
5. 演变图
5.1 基本介绍
在监控页面首先显示了12副图,点击“其他的图”,可以显示隐藏的其他图。这些图都是记录的某一度量值在指定时间段(天、周、月、年或其他自定义时间段)内得时间演变过程。
所有的图展示的测量值如下显示:
- Java内存
- JavaCPU使用情况
- 用户Session数量
- JDBC连接数
- 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)。而且都可以通过右下角的“描述”查看具体的请求详细信息。
所有请求的种类有:
- Http统计
- sql 统计(jdbc)
- Ejb统计(如果ejb3在JavaEE 5+上发布)
- Spring统计(如Spring)
- Guice统计(如果guicefa ades)统计界面(没有ejb3,Spring或gu ice)
- jsf动作的统计
- struts操作统计使用jsp页面(或更准确地说,在httpServletRequest.getRequestDispatcher上执行include或forward的统计信息,这些是一般的jsp页面)
请求图表均包含一下字段:
- 请求
- 总的累计时间
- 点击
- 平均时间
- 最大时间
- 标准偏差
- 积累的CPU时间
- 平均CPU使用时间
- 系统错误
这里包含Http统计表、SQL统计表、JSP统计表,
6.2 系统错误
Http系统错误:
显示250个最常见的错误信息列表,以http错误代码来标识。
系统错误日志:
应用程序写入的“警告”和“严重”日志。显示了500个最常见的错误日志列表。
两表显示了所选时间段内的个案数量和平均请求时间等信息,详细的信息可以查看“描述”,“最后的错误”显示最后一百个错误。通过单击错误日志名称,当错误是Java异常时,可以看到Java stack-trace错误。
6.3 当前请求
该表显示当前系统正在执行的请求,最初只显示最长的请求,通过点击“+详细信息”链接显示其他请求。
如果系统出现错误,通常会伴随某些请求无法完成,在这里可以找到未能完成的请求信息,有助于确定系统出错位置。
6.4 系统信息
系统信息在生成报告时显示有关java服务器、状态和服务器操作系统上的一些信息。最初以文字的形式展示java内存、http会话、CPU占用率等信息,这里的信息与最开始的演变图信息保持一致。
同时这里还包含一些系统操作链接,可以用来在监控发现问题时进行查询、验证或者解决问题。
具体操作如下:
- “执行垃圾收集器”,强制释放内存
- “生成堆转储”,将所有内容转储到服务器上的临时目录的文件中,您可以使用JDK的VisualVM或Eclipse MAT
- '查看内存直方图',显示每个java类的内存中的实例数
- “无效http会话”,强制所有用户断开连接
- “查看http会话”,查看属性,序列化大小(通常高于内存大小),国家和每个会话的用户(如果通过JavaEE进行身份验证)
- '查看部署描述符':应用程序的web.xml文件
- “MBeans”:管理bean,如jconsole或jvisualvm,在应用程序服务器和JVM上有一些配置和技术数据。这些值是可见的,但不可写,无法执行操作。
- “查看操作系统进程”:操作系统进程列表(具有ps或Windows的任务列表的linux)和每个进程的用户,内存和CPU
- 'JNDI tree':浏览JNDI上下文,例如查找JDBC数据源的路径和名称。为了帮助找到可能的jdbc连接泄漏
- '打开的jdbc连接'显示打开jdbc连接的位置的堆栈跟踪列表。
- “数据库”:数据库的信息和统计信息(如果PostgreSQL,MySQL,Oracle,DB2,Sybase或H2),例如当前的sql请求或者oracle是累积时间中最长的请求,显示cpu时间和缓冲区的基本成本()获得。如果在应用程序中配置的连接到数据库的用户没有必要的权限,此功能将显示错误
6.5 线程信息
此表显示服务器中所有线程的列表,在“描述”中还包括每个优先级,工具提示中的状态和堆栈跟踪等。
7. 总结
Javamelody对于服务器的监控包含许多方面,初看会觉得信息过多,有些冗杂。我们首先需要了解监控信息显示页面各部分的含义,然后根据需要查看不同部分。
如果需要了解服务器大体运行状态,可以重点演变图,这样可以观察到随时间变化各数据的变化趋势。想看数字信息,可以直接阅读系统信息部分。如果观察到图表均匀变化,通常说明系统运行正常,观察CPU占用率和内存占用可以知道当天哪些时段系统运行频繁、负载很大。
如果需要关注系统异常,可以在观察完演变图后,直接查看系统错误部分。查看http系统异常与系统日志异常可以快速了解系统出现的错误的信息。想了解详细信息,可以查看 “描述”。
请求统计部分可以粗略的显示出系统异常出现的频率,还可以详细的展示各种请求的平均时长。了解系统各部分时间消耗,这里可以重点关注。
各部分的信息需要结合服务器,如果想要更高效的使用,需要积累更多经验。监控平台不仅提供了信息显示,也提供了一些操作,在“系统信息”部分,可以使用一些操作解决部分问题。