Skip to content

Profiler

Calvin edited this page Nov 13, 2013 · 7 revisions

选型

在性能调优时,总想知道一些函数消耗的时间,找出瓶颈。有很多开源方案能满足这一点,几者之间相差毫厘而已。

从大的分类上,Profiler工具不同于Netflix ServoYammer Metric, etsy statsd 这些Monitor/Metrics工具,莫要搞混了。

基于编码或AOP的:

  • JaMon,可能最为老牌,但也有很久没更新了。
  • JavaMelody,LGPL的协议,而且管得太多了,连CPU、内存都管,Web Dashboard也不好看。
  • Perf4j,没有内置Web Dashboard。
  • JavaSimon,各方面正合适,作者原来也用JaMon,后来加了树型排列结果与纳秒级统计的支持,详见Javasimon自述

基于JVM整体的profiler:VisualVM,EClipse Profiler,Yourkit 等,经常过大过慢和崩溃,失望了几次后就不再尝试了。

##JavaSimon Simon不是西蒙,是Simple Monitoring的意思,太简单了,和其他几种monitor也差不多,几乎没什么好讲的,看官方的简短文档就足够。

在showcase中作了演示,手工点击综合演示或运行Jmeter脚本后,查看dashboard即可看见结果。

一、pom.xml,加入core与dashboard的依赖:

			<dependency>
				<groupId>org.javasimon</groupId>
				<artifactId>javasimon-spring</artifactId>
				<version>3.3.0</version>
			</dependency>
			<dependency>
				<groupId>org.javasimon</groupId>
				<artifactId>javasimon-console-embed</artifactId>
				<version>3.3.0</version>
			</dependency>

二、web.xml,加入dashboard:

	<servlet>
		<servlet-name>SimonConsoleServlet</servlet-name>
		<servlet-class>org.javasimon.console.SimonConsoleServlet</servlet-class>
		<init-param>
			<param-name>url-prefix</param-name>
			<param-value>/javasimon</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>SimonConsoleServlet</servlet-name>
		<url-pattern>/javasimon/*</url-pattern>
	</servlet-mapping>

三、applicationContext.xml 加入AOP设置

如下片段监控用@monitored定义了的类或方法:

	<!-- 调用StopWatch计时的Interceptor -->
	<bean id="monitoringInterceptor" class="org.javasimon.spring.MonitoringInterceptor" />

	<!-- 监控定义了@Monitored的方法 -->
	<bean id="monitoringAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
		<property name="advice" ref="monitoringInterceptor" />
		<property name="pointcut">
			<bean class="org.javasimon.spring.MonitoredMeasuringPointcut" />
		</property>
	</bean>

如果在其他xml文件未包含DefaultAdvisorAutoProxyCreator,此处需要定义:

	<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
		<property name="proxyTargetClass" value="true" />
	</bean>

四、在已知一定要监控的类或方法上加@Monitored。

五、不修改代码监控新的方法

如下AOP定义片段监控了NotifyMessageProducer与BusinessLogger的公共方法:

	<aop:config>
		<aop:advisor advice-ref="monitoringInterceptor" pointcut="execution(public * org.springside..NotifyMessageProducer.*(..)) 
		|| execution(public * org.springside..BusinessLogger.*(..))" />
	</aop:config>

六、(可选)监控jdbc访问速度 换用新的jdbc driver,在旧的jdbc url里插入simon

jdbc.driver=org.javasimon.jdbc4.Driver
jdbc.url=jdbc:simon:h2:file:~/.h2/showcase4;