Neo's Life

星期五, 10月 27, 2006

Java Profiler - YourKit Java Profiler(一)


閒話家常

這幾天有個同學訂婚,老泰與泰嫂參加了喜宴。參加這種聚會,大家難免會聊聊近況。但老泰萬萬沒想到,在酒足飯飽後,泰嫂竟然在所有同學面前,說老泰在公司有多閒,而且閒到在寫Blog。一向行事低調的老泰當場愣住,急忙之下就當場教訓起泰嫂,就這樣害老泰被冠上打老婆的罪名。其實,全世界的人都可說老泰很閒,只有泰嫂不行。因為,家裡大大小小的東西,都是這個傢伙上網買來了,嘿嘿.....不用想也知道是什麼時間買的。上班無聊就上網逛一逛,不時老泰的MSN 都會跳出許多各式各樣產品的URL。幹什麼呢?就是要老泰給個建議,看要買哪一種好。更厲害的來了,最近知道老泰開始寫Blog,泰嫂竟然無聊到在催老泰的槁。挖哩咧......



一、前言

前一陣子老泰被拐到大陸去。本來說是有好料的,結果去了後才曉得又是很'賽'的工作 - 幫別人擦屁股的工作。原來是公司的產品在客戶哪裡出了些問題,弄的客戶有點不爽。其中有個問題比較機車,老泰跟它交手過幾回,結果都無疾而終。這次發誓不搞定它就不回台灣。公司的產品很特別,在公司內部怎麼測都沒問題。一正式上Production 就問題一狗票,當然有可能是每個客戶,都會對該產品有些客製化的原因。這次又在某個客戶端發現可能有Memory leak 的問題。

老泰真的很遜,一個Memory leak的問題處理了幾次都還搞不定。之前老泰用了Eclipse - Test & Performance Tools Platform(TPTP),嘗試在Production env. 來定位問題點,結果呢?整個Production 的Performance 整個都down 了下來,那時候可真是嚇壞老泰了。真是豬頭,誰叫你去客戶Production env. 搞這個東西。正常人都是在自己家裡頭弄,你這不是找死嗎?唉...老泰真的也是出自無奈,是真的沒有辦法在自己家裡reproduce 出這種情況,所以只好到客戶端搞搞它。就是搞不懂客戶怎麼那麼厲害,可以走到那些有問題的call path 。總之,之前用了TPTP 的經驗是:

  • 不適合在Production env. 來監測(Performance的影響相當大)

  • 操作複雜(尋找Memory leak 與Performance bottleneck 的方法較為複雜)

  • 支援 的平台有限(Profiler 大多與native lib有關,所以是否提供完整、各個平台的lib,相當重要)
當然,那個時候TPTP 還沒有final release。所以老泰用的是beta的版本啦,所以可能給人的感覺不好。另外,那個時候TPTP 還是使用JVMPI 來做profiling,相信這個也是影響Performance的因素之一。不過,好像後來已經有用JVMTI 來implement 了。

經過上次使用TPTP在 Production evn. 的經驗後,迫使老泰繼續尋找好用的Java Profiler。而YourKit Java Profiler就是其中一套,老泰覺得不錯,而且還蠻適合在Production env. 上監控AP、與進行Profiling 的工具。總結他的特點,就是light-weight,操作夠直覺。


二、Java Profiler

Java Profiler是幹啥用的?什麼時候要用它呢?老泰對Java Profiler的定義是:在不改動任何程式碼的情況下,來觀察與分析Runtime 的Java Application。觀察的項目可能包含:CPU、Memory、Thread 等。簡單的來說就是用來找碴的啦。用途很廣,有人用它來找出Memory leak、Performance bottleneck、Thread lock等問題。有人用它來瞭解程式碼在Runtime 的行為,更進階的用途是幫忙分析並破解Java Application 的License 限制...哈哈哈。當然還有其它的用途,像是涵蓋率分析、執行順序分析、記憶體使用分析等等。

當然,不是每一家都有這些功能,各家可能有各家的賣點。不過,大多數都有協助找出Memory leak、Performance bottleneck 的功能。


三、YourKit Java Profiler

YourKit 的操作相當的直覺,設定的部分也蠻簡單的,如下圖所示。主要有兩大功能:CUP Profiling、Memory Profiling,並且可以對Java ME、SE、EE 的Application 來做Profiling。下圖的左上角即可以選擇,所要連接到的Application 位置或型態。


Configuration

有些Profiler在使用上,較為麻煩。必須先啟動Profiler,並且在Profiler 內部設定專案、Binary code、Source Code、Class path...等,最後必須在Profiler 內部啟動被監控的程式。整個過程相當麻煩。然而,YourKit則非常的簡單,只需要在java 後加入一些參數即可。以下是針對JDK 1.5 以上的版本的設定

set PATH=%PATH%;C:\javasoft\YourKit Java Profiler 5.5.4\bin\win32
set JAVA_OPTS= -agentlib:yjpagent=cpu=times,onexit=cpu
,usedmem=89,dir=C:\YourKit\log

java %JAVA_OPTS% You_Main_Class
or
set JAVA_OPTS= -agentpath:C:\YourKit\win32\yjpagent.dll=cpu=times,
onexit=cpu,usedmem=89,dir=C:\YourKit\log

java %JAVA_OPTS% You_Main_Class

我們可以選擇上述其中一種方式來設定。設定完成後,只需啟動該程式即可使用YourKit 的漂亮GUI來進行操作了。在上述設定中"=cpu=times, onexit=cpu, usedmem=89, dir=C:\YourKit\log"的參數主要是用來進行Off-line Profiling。YourKit 的設計中Off-line Profiling 的功能相當好用、設定也簡單。特別是運用在Production env. 中,客戶絕對感覺不到你有使用Profiler。在啟動程式時,只需跟平常一樣執行程式,不需要其它的操作。當然,也不能亂設定,不然在Performance 的表現上肯定會有感覺。

一般On-line Profiling 的操作並不需要加上"=cpu=times, onexit=cpu, usedmem=89, dir=C:\YourKit\log",也可以將它去除。大略說明一下相關的參數:

  • cpu=times/full - 程式一開始後,立刻進行CPU Profiling。

  • usedmem - 在Heap memory 的使用量達到某一個百分比時,自動抓取Memory snapshot。

  • onexit=cpu/memory/both - 在程式結束前,抓取CPU snapshot/Memory snapshot/CPU & Memory snapshot。

  • dir - CPU & Memory snapshot存放的路徑。

上面只是簡單的說明一些參數,詳細的使用及參數間的相依性,還是要參考一下YourKit 的手冊。設定完成後,就可以啟動你的程式。接下來,請開啟YourKit,如果你的程式放在Local,請點選"Connect to locally running profiled application..."。如果是跟YourKit 放在不同一台機器,則點選"Connect to remote application..."。那最後一個呢?幹嘛用的?怎麼用?嘿嘿...不知道,沒用過。下圖為"Connect to remote application..."時,必須輸入Remote IP 位置。


雖然Off-line Profiling 允許儲存CPU & Memory snapshot,但美中不足的是,不能把Telemetry 的資料也給存下來。可惜,可惜...。


To Be Continued......



標籤: , ,

0 個意見:

張貼留言

訂閱 張貼留言 [Atom]



<< 首頁