用JProfiler監測修正CPU Loading漏洞

0

Posted by Victorlau | Posted in IT Sleepless | Posted on 08-Sep-2009

最近幾天其中一部Web Server突然間非常不穩定, CPU Loading 非常非常高. 這令到在其上面的網站的服務經常要重啟. 在查看了Firewall 和 Web Server 的大量日志文件後, 沒有得到什麼特別的異常信息. 而且除了CPU Loading 很高之外, Server上所有其他資料都沒有異常. 按照經驗, 這基本可以肯定是某些網站的代碼出問題了. 可是在Server Crash開始發生的第一天的前後, 網站都沒有作什麼重大代碼更新, 之前一直運作正常, 怎麼突然就出錯呢?

為了找出代碼出錯原因, 試用了一個巨人級產品, JProfiler. 在這里向所有Java 開發者推薦這個功能強大的Profiling 軟件, 它支持Local Application, Remote Application, Application Server 等的監控, 可以監測到CPU Loading, Memory / Heap 的使用情況, 精確到每一個Method Call. 官方網站 提供了Evaulation License, 雖然只可以免費使用全部功能10天, 但對我們這種偶而用來檢查系統漏洞的開發者是足夠有余了(10天也找不出來, 要嘛是根本沒漏洞, 不然就是搞錯方向了).

JProfiler 軟件的用法很簡單, 這里不打算多說, 要提一下的是, 對要監測Remote Application的開發者, 需要下載兩個版本(版本號必需一致), 例如我就同時下載了Windows 和Linux版本(都是5.2.3), 因為我要在Windows環境下監測 Linux Server的情況. 在配置Windows里的JProfiler的Remote Integration Session時, 會得到兩個重要參數, 一個是JAVA_OPTS參數, 另一個是LD_LIBRARY_PATH 路徑, 這兩個參數都要作為環境變量(Environment Variables) 加到Remote Server 的Startup script 里去, 我的情況是加到Tomcat 里的catalina.sh的 “start” case 里去. 一旦配置成功, 在啟動Tomcat Server後, 它會等待Windows 這邊的JProfiler連接才能完成啟動 (應該是可以不等待的, 但按說明文件說法是等待方案比較簡單, 所以我就用了).

Remote Integration 成功後, 就可以在Windows 這邊的JProfiler里看到Linux 里的Tomcat Server的運行情況, 在一輪監測後, 真凶終於出現了, 是在While循環一個indexOf 語句. 它的用途主要是用來去掉某些用戶發表的文章里的無用代碼如<–if…endif>, <style…/style> 等等, 這里一定要罵一下自己, 是最開始偷懶之過. 由於那時一時想不到怎麼寫那段Regular Expression, 所以沒有用到ReplaceAll方法, 直接就用While循環在做, 這種做法在當時那訪問量下沒有什麼問題, 但最近訪問量上升, 剛好有幾個用戶發表了一些含有大量問題代碼的文章內容, 在這雙重因素作用下, 原來的差劣代碼就出問題了, 於是CPU loading就一直高據不下. 於是立刻用ReplaceAll和Regular Expression修正了這個問題. 至於ReplaceAll 對於IndexOf + While 的性能差距, 可以問一下Google 或者查看 Java Doc.

至此, 問題解決.

Post to Twitter Post to Plurk Post to Delicious Post to Digg Post to Facebook Post to StumbleUpon

Related posts:

  1. 這是一個瘋狂併購的年代
  2. 日久生疏 – 負數的二進制表示
  3. Java 4*Ever

Tags: , ,

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

Write a comment