目录

Profiler

优质
小牛编辑
140浏览
2023-12-01

选型

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

从大的分类上,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;