-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Profiler
Calvin edited this page Nov 13, 2013
·
7 revisions
在性能调优时,总想知道一些函数消耗的时间,找出瓶颈。有很多开源方案能满足这一点,几者之间相差毫厘而已。
从大的分类上,Profiler工具不同于Netflix Servo,Yammer 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;