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......



標籤: , ,

星期三, 10月 18, 2006

License Management - Protection! Licensing Framework for Java

一、前言

老泰最近收到老闆的命令,說是要研究一下公司產品的License 管理。可能是因為最近產品要部署到非Windows 的環境,所以才發現原本License 管理的架構要porting 到Unix-like 的環境很麻煩。所以放眼望去全公司只有老泰,身上穿著短袖、短褲,腳下踩著夾腳鞋,手上拿個扇子還在那煽啊煽......就是這傢伙,過太爽。就這樣工作就派到老泰的頭上。

不知道這算好還是壞,以前沒玩過這方面的東西,能夠玩玩也不錯。但是又想想,每次為了產品study 或 survey新的技術或工具都很累,特別是非常傷眼力、腦力。總而言之,心裡很矛盾。說起來,搞產品的人還真命苦。做個產品因為怕人Decompile 竊取公司的資產,所以還要搞個Code protection。再來就是還得弄個Installer,方便客戶安裝。這還不夠,又怕客戶不付錢,還要做個License 管理。想到就辛苦,還是做專案好。

說實在的,中國人特別討厭License Management。老泰在網路上找了半天,沒有幾篇中文網頁再討論這個話題。就算有也只是一兩行,敷衍的帶過。另外,找了幾個做License Management的產品,想說大陸的網站上很多都有提供'合法測試用的序號'。沒想到什麼軟體工具都有,就是找不到有關License Management的。想想也對,中國有13億人口,可能將近一半的人在幹'破解'這一行。自然根本不會有這類軟體的需求,難怪找不到。

二、License Management

License Management 不知道要怎麼定義。老泰的定義是:License Management 是要告訴客戶,誰是老大,並且在客戶付錢之前,先給客戶一些甜頭,但是又不能過頭的一種軟體保護機制。總之它主要的目的是要達到

  1. Copy protection
  2. Demo license conrtol
  3. Feature control
  4. User licensing

這些是基本大多廠商提供的功能,當然根據每個License Management產品的不同也有提供自家獨有的賣點,如License 後端管理功能是否健全完善、License delivery的機制等。

三、Protection! Licensing Framework for Java

老泰對Protection! 的瞭解並不深,目前還是停留在功能的研究。還沒有正式開始下去implement ,因為懶.......。所以不用期待會有多深入的探討。當然,老闆的態度也很重要,這決定了老泰是不是要對該產品深入的瞭解。

Protection! 是一組Java-based的Framework。這是他們非常強調的,也就是說。不是你買來,用了他們的工具,滑鼠拖拉一下,按個按鈕License就做完了。還必須靠Developer 來給它'整合'一下。Protection! 給人的感覺是很簡單,沒有太過複雜的設定、也沒有必要架設複雜的License Sever。這是最令人感到高興的。 簡單說一下它的功能,可以說他大致上都涵蓋了上述的四個目的 - Copy Protection, Demo License Control, Feature Control, User Licensing。廣度大至上是做足夠了,深度做到什麼樣的程度?老泰現在也說不准,大家自己判斷好了。但是除了基本的功能外,Protection!也做足了有關License Delivery的機制。以及對某些Resource 做CRC 判斷的功能。這應該算是有些加分的效果吧。

其實最令老泰感興趣的是有關Floating License這功能是怎麼做到的。特別印象深刻的是,手冊上寫Protection! 在驗證License 時是UDP 來Broadcasting 給所有的User。然後分析每個user 的response,最後如果超過了人數的上限,再呼叫某個Interface 的某個Method。如此一來,就不用有License Server,架構也簡單許多。但是,整個機制是怎麼做到的?有沒有什麼限制?恐怕還是要實際implement 後才會有明確的答案。或許過兩天有空,研究一下Protection! 是怎麼做到的在跟大家報告一聲。

另外有個有趣的東西是CRC檢驗的功能。在Protection! 手冊裡提到,該功能可以有效避免惡意的更新程式。這個基本上的概念並不難,但是實際在提供這個功能時Protection! 似乎並不周全。當然很有可能是老泰並不瞭解。CRC的驗證是根據使用者所選擇要做的資源為對象,來進行SHA-1或MD5演算。然後,再進行License的驗證前,先驗證這些資源的完整性,使否有被非法的惡意程式修改或置換。但是,Protection! 在保存這個Digest 時並沒有特別的處理。並且將這些必須驗證的資源與這個Digest放在同一個Class 裡面。這就是不能理解的地方了。這樣做只要有心人士換掉這個Class,那麼CRC驗證的功能就形同廢物。當然,可能是老泰還沒弄懂之間的奧秘吧。阿彌陀佛.....#$%^

上圖為Protection! 的Control Center。什麼東西啊?說明白了就是License Generator,就是幫你產生License的工具。這個工具最主要的功能就是幫你產生License file。至於怎麼在你的產品裡面做驗證,這個還得要靠Developer。當然,Protection! 有一組API 來做這件事,所以放心,不難做。

在為你的產品產生License前,必須先設定產品基本的資料。

Feature Control相關的設定介面。

設定不同的Edition有什麼樣的Feature

Copy Protection相關設定的介面。如上圖'Lock License to'的區域。

CRC相關的設定介面,在視窗的上面可以增加要保護的資源檔案與路徑。視窗中間有可以產生Digest的按鈕,該按鈕可以自動幫你修改下面的code snippet。

該介面根據設定來產生License file,這個介面可以設定Demo license control與User licensing。

標籤: ,