2013年6月4日星期二

JDev_039:使用Log Analyzer分析性能瓶颈

开发运行环境:JDeveloper 11.1.2.4

常常有这样的情况,发现某个页面特别慢,但又不知道原因,这让工程师非常苦恼。
增加LifeCycle Listener需要增加代码,重新发布,很不方便。那么,有没有一个比较方便的工具呢?
本文介绍如何使用JDeveloper中自带的Log Analyzer分析某个请求的生命周期,从而找到问题的症结所在。

1. 设置Integrated WebLogic Server的日志级别
(1)在Application Server Navigator中右键IntegratedWebLogicServer


 (2)选择Configure Oracle Diagnostic Logging for "IntegratedWebLogicServer"

(3)设置日志级别
Root Logger:CONFIG
oracle:CONFIG
oracle.adf:FINEST
oracle.adfinternal:FINEST
oracle.jbo:FINEST

这些设置立即生效,不用重启WebLogic Server。

2. 选择Tools->Oracle Diagnostic Log Analyzer,点击By ADF Request
(1)访问有性能问题的页面,这里会捕捉到每一次的请求,并且把每个JSF生命周期所花的时间统计出来。
这里,可以看出INVOKE APPLICATION阶段,花了2秒多。


(2)点击展开INVOKE APPLICATION阶段,发现是getEmps方法花了2秒多。


至此,我们大概知道是getEmps方法导致了页面比较慢。
如果想要知道getEmps具体慢的原因,除了看代码之外,还可以使用CPU Profile。

3. 设置CPU Profile参数
(1)右键ViewController,选择Run/Debug/Profile,点击Edit,修改Default设置


(2)点击Profiler,选中“Begin Use Case on Application Startup”


(3)点击CPU,勾上“Sample CPU time”中所有子项。


4. 启动CPU Profiler,访问有性能问题的页面


(1)会列出被调用的所有的Method,输入getEmps,查找该方法。
会发现该方法并没有占有CPU时间,这是怎么回事呢?


(2)进一步查看其它参数,发现它花在等待的时间是2秒多,说明这个方法大部分时间在“睡大觉”。



Project 下载:ADF_Performance_Logger.7z

参考文献:
1. http://www.redheap.com/2013/01/instrumentation-performance-diagnostics-with-adflogger.html
2. http://xmlandmore.blogspot.jp/2012/01/starting-cpu-profiler-in-jdeveloper.html
3. http://www.youtube.com/watch?v=dHBEY_MPKRk
4. https://blogs.oracle.com/groundside/entry/adventures_in_adf_logging_part4

没有评论: