tag:blogger.com,1999:blog-228216952024-03-22T02:19:16.389+08:00Neo's Life個人生活筆記含技術、想法、抱怨.....Unknownnoreply@blogger.comBlogger4125tag:blogger.com,1999:blog-22821695.post-33365824431561383732009-04-14T19:40:00.024+08:002009-04-14T21:06:29.308+08:00DB Connection leaks 的偵測與定位<span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><p><span style="font-family:Times New Roman;font-size:130%;"><b>Summary</b></span></p><p> <span style="font-family:Times New Roman;font-size:100%;">DB Connection</span><span style="font-family:標楷體;font-size:100%;">的使用是每一個案子幾乎都會使用到的。透過</span><span style="font-family:Times New Roman;font-size:100%;"><wbr>Connection</span><span style="font-family:標楷體;font-size:100%;">程式才有辦法與資料庫做溝通。但是</span><span style="font-family:Times New Roman;font-size:100%;">Prog<wbr>rammer</span><span style="font-family:標楷體;font-size:100%;">在程式端對</span><span style="font-family:Times New Roman;font-size:100%;">DB Connection</span><span style="font-family:標楷體;font-size:100%;">的利用,似乎存在著太多的不小心。<wbr>往往這些不小心都是在上線後,於</span><span style="font-family:Times New Roman;font-size:100%;">Production</span><span style="font-family:標楷體;font-size:100%;">的環境中才<wbr>被發現。通常這對</span><span style="font-family:Times New Roman;font-size:100%;">PS</span><span style="font-family:標楷體;font-size:100%;">部門直接面對客戶的一線人員造成了許多的困<wbr>擾,也使得專案造成了許多的傷害。該篇文章簡述了在</span><span style="font-family:Times New Roman;font-size:100%;">NCIC</span><span style="font-family:標楷體;font-size:100%;">的案<wbr>子中所經歷的</span><span style="font-family:Times New Roman;font-size:100%;">DB Connection leaks</span><span style="font-family:標楷體;font-size:100%;">處理方式,其中包含了問題的偵測以及定位,<wbr>最後提供小小的建議,以供大家做參考。</span></p><p><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"></span></span></p><p><span style="font-family:Times New Roman;font-size:130%;"><b>DB connection leaks</b></span></p><p> <span style="font-family:Times New Roman;font-size:100%;">DB Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的發生主要是來自於程式向</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">取得了</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">,<wbr>但是在使用後卻沒有歸還或關閉。</span><span style="font-family:Times New Roman;font-size:100%;">Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的發生最後必定會導致系統沒有</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">可<wbr>用,而當沒有</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">可使用的情況下,只要有任何的</span><span style="font-family:Times New Roman;font-size:100%;"><wbr>Http Request</span><span style="font-family:標楷體;font-size:100%;">是會用到</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">的,<wbr>自然會沒反應或是拋出錯誤(依照</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">與</span><span style="font-family:Times New Roman;font-size:100%;">Error handling</span><span style="font-family:標楷體;font-size:100%;">的機制而有所不同)。<wbr>然而為什麼會沒有歸還或關閉</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">?<wbr>這是另外一個議題,將不在這裡做討論。</span></p><p><span style="font-family:Times New Roman;font-size:130%;"><b>Attributes of Connection Pool</b></span></p><p> <span style="font-family:標楷體;font-size:100%;">對於</span><span style="font-family:Times New Roman;font-size:100%;">PM</span><span style="font-family:標楷體;font-size:100%;">或任何接觸客戶的一線人員,比較關心的是既然</span><span style="font-family:Times New Roman;font-size:100%;">D<wbr>B Connection</span><span style="font-family:標楷體;font-size:100%;">是系統中重要的資源,要監控什麼東西?<wbr>並且如何斷定有異常的狀況?以便及早發現問題。對於現有市面上的</span><span style="font-family:Times New Roman;font-size:100%;"><wbr>Connection pool</span><span style="font-family:標楷體;font-size:100%;">大致上都包含了幾個重要的屬性,可供參考。以下就</span><span style="font-family:Times New Roman;font-size:100%;">JBo<wbr>ss</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">為例來說明:</span></p><ol type="1"><li><span style="font-family:Times New Roman;font-size:100%;">AvailableConnectionCount: </span><span style="font-family:標楷體;font-size:100%;">該</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">中,目前可供使用的</span><span style="font-family:Times New Roman;font-size:100%;">DB Connection</span><span style="font-family:標楷體;font-size:100%;">數量。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">ConnectionCount: </span><span style="font-family:標楷體;font-size:100%;">目前與已經建立的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">數量。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">InUseConnectionCount: </span><span style="font-family:標楷體;font-size:100%;">目前正在被使用的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">數量</span></li><li><span style="font-family:Times New Roman;font-size:100%;">MaxSize: </span><span style="font-family:標楷體;font-size:100%;">該</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">中最大</span><span style="font-family:Times New Roman;font-size:100%;">Connection </span><span style="font-family:標楷體;font-size:100%;">數量。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">MinSize: </span><span style="font-family:標楷體;font-size:100%;">該</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">中最少應保留的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">數量。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">MaxConnectionsInUseCount: </span><span style="font-family:標楷體;font-size:100%;">在</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">被建立後,</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">使用的尖峰值。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">ConnectionCreatedCount: </span><span style="font-family:標楷體;font-size:100%;">在</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">被建立後,新增且加入</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">總數。</span></li><li><span style="font-family:Times New Roman;font-size:100%;">ConnectionDestroyedCount: </span><span style="font-family:標楷體;font-size:100%;">在</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">被建立後,被移除且斷線的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">總數。</span></li></ol><p> <span style="font-family:標楷體;font-size:100%;">一般而言,長時間的對</span><span style="font-family:Times New Roman;font-size:100%;">InUseConnectionC<wbr>ount</span><span style="font-family:標楷體;font-size:100%;">來觀察,對</span><span style="font-family:Times New Roman;font-size:100%;">connection leaks</span><span style="font-family:標楷體;font-size:100%;">的發現會是比較有幫助的。若有</span><span style="font-family:Times New Roman;font-size:100%;">Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的問題,可以由觀測圖發現</span><span style="font-family:Times New Roman;font-size:100%;">InUseConnecti<wbr>onCount</span><span style="font-family:標楷體;font-size:100%;">的曲線會呈現梯型,如圖一所示。</span></p></span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcn6f3cGuMlorjmoj8pzNcrZolcK5lNAf-1nufvp7x2laFIkXqGS1xABHS7uyq_dW5wxjFBVwM-9ZkObj4y68bJt-USfpvWm-5ZLt3Ais16Y4JHPGXWdiPpV5N7_rE4FTdZBDd3g/s1600-h/connection-pool-01.JPG" style="text-decoration: none;"> <img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 390px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcn6f3cGuMlorjmoj8pzNcrZolcK5lNAf-1nufvp7x2laFIkXqGS1xABHS7uyq_dW5wxjFBVwM-9ZkObj4y68bJt-USfpvWm-5ZLt3Ais16Y4JHPGXWdiPpV5N7_rE4FTdZBDd3g/s400/connection-pool-01.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324513644356721522" /><br /></a><div style="text-align: center;"><span class="Apple-style-span" style="color: rgb(0, 0, 238);"><span style="font-family:標楷體; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-bidi-Times New Roman";mso-font-kerning:1.0pt;mso-ansi-language: EN-US;mso-fareast-language:ZH-TW;mso-bidi-language:AR-SAfont-family:";"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><span class="Apple-style-span" style="font-size:medium;">圖一、</span></span></span><span lang="EN-US" style="font-family:"Times New Roman";mso-fareast-mso-font-kerning:1.0pt;mso-ansi-language:EN-US;mso-fareast-language:ZH-TW; mso-bidi-language:AR-SAfont-family:標楷體;"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><span class="Apple-style-span" style="font-size:medium;">Connection pool</span></span></span><span style=" font-family:標楷體;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family: "Times New Roman";mso-bidi-Times New Roman";mso-font-kerning:1.0pt; mso-ansi-language:EN-US;mso-fareast-language:ZH-TW;mso-bidi-language:AR-SAfont-family:";"><span class="Apple-style-span" style="color: rgb(0, 0, 0);"><span class="Apple-style-span" style="font-size:medium;">使用觀測圖</span></span></span></span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family:標楷體;"><br /></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><p><span style="font-family:Times New Roman;font-size:130%;"><b>Detect connection leaks</b></span></p><p> <span style="font-family:標楷體;font-size:100%;">瞭解了有哪些</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">的屬性可以幫助我們來觀測</span><span style="font-family:Times New Roman;font-size:100%;">Connection leaks</span><span style="font-family:標楷體;font-size:100%;">,<wbr>接下來的問題就是要用什麼工具才能監控我們所感興趣的</span><span style="font-family:Times New Roman;font-size:100%;">Conne<wbr>ction pool</span><span style="font-family:標楷體;font-size:100%;">中的屬性?以</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">為例,</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">採用了</span><span style="font-family:Times New Roman;font-size:100%;">JMX</span><span style="font-family:標楷體;font-size:100%;">的<wbr>方式來提供這樣的資訊。換句話說,</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">Connecti<wbr>on pool</span><span style="font-family:標楷體;font-size:100%;">都有相對應的</span><span style="font-family:Times New Roman;font-size:100%;">MBean</span><span style="font-family:標楷體;font-size:100%;">,稱為</span><span style="font-family:Times New Roman;font-size:100%;">"<wbr>ManagedConnectionPool"</span><span style="font-family:標楷體;font-size:100%;">,藉由這個</span><span style="font-family:Times New Roman;font-size:100%;">MBe<wbr>an</span><span style="font-family:標楷體;font-size:100%;">我們可以取得有關該</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">的內部訊息。透過下列的步驟我們可以找到</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">MBean</span><span style="font-family:標楷體;font-size:100%;">,並且獲得相關訊息:</span></p><ol type="1"><li><span style="font-family:標楷體;font-size:100%;">進入</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">JMX console</span><span style="font-family:標楷體;font-size:100%;">的首頁,並且搜尋</span><span style="font-family:Times New Roman;font-size:100%;">"<wbr>ConnectionPool"</span><span style="font-family:標楷體;font-size:100%;">,如圖二所示。<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9f0Jxs3yjPqWix5iUKoFoB0qGiWtbwiJFWTNrUMwUFSDAvQHR3__u1tkOL2NWJ6NxS3K6H4bdeBsX3-1sEbuDmqmAVKK141i0dBOfKWyh7EEkbZkpTuWjNsadsA_cg4n3Y1OUeQ/s400/connection-pool-02.JPG" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5324514863620983410" /><span class="Apple-style-span" style=" ;font-family:Georgia;"><div style="text-align: center;"><span style=" ;font-family:標楷體;">圖二、</span><span lang="EN-US" style=" ;font-family:'Times New Roman';">JBoss</span><span style=" ;font-family:標楷體;">的</span><span lang="EN-US" style=" ;font-family:'Times New Roman';">JMX Console</span><span style=" ;font-family:標楷體;">頁面</span></div></span></span><br /></li><li><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">搜尋待監控的</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">。可由</span><span style="font-family:Times New Roman;font-size:100%;">"name"</span><span style="font-family:標楷體;font-size:100%;">來區別不同的</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span><span style="font-family:標楷體;font-size:100%;">,如圖三所示。</span></span><br /></span></li><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbj-Bu0APqDfqoNMxV-VIdb7sIteQejIWSCYNzk6hnLeA8iTABHChtMch9ZhO-kC_9-1r5-BPg1-H42-ucRkTTW5ewwyYcWahVTyehv0gEj44wdy3pTahM0U00Gjti5467_Ii9Og/s1600-h/connection-pool-03.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 175px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbj-Bu0APqDfqoNMxV-VIdb7sIteQejIWSCYNzk6hnLeA8iTABHChtMch9ZhO-kC_9-1r5-BPg1-H42-ucRkTTW5ewwyYcWahVTyehv0gEj44wdy3pTahM0U00Gjti5467_Ii9Og/s400/connection-pool-03.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324517317176559362" /></a><span style="font-family:標楷體;font-size:100%;"><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">圖三、搜尋待監控的</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool</span></span><br /></div></span><br /><li><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">點選搜尋到的</span><span style="font-family:Times New Roman;font-size:100%;">"ManagedConnectionPool"</span><span style="font-family:標楷體;font-size:100%;">,<wbr>即可看到該</span><span style="font-family:Times New Roman;font-size:100%;">MBean</span><span style="font-family:標楷體;font-size:100%;">所提供的詳細資訊,如圖四、五所示。<wbr>相關資訊,如上個段落所提到的:</span><span style="font-family:Times New Roman;font-size:100%;">AvailableConnec<wbr>tionCount</span><span style="font-family:標楷體;font-size:100%;">、</span><span style="font-family:Times New Roman;font-size:100%;">ConnectionCount</span><span style="font-family:標楷體;font-size:100%;">、</span><span style="font-family:Times New Roman;font-size:100%;">InUs<wbr>eConnectionCount</span><span style="font-family:標楷體;font-size:100%;">、</span><span style="font-family:Times New Roman;font-size:100%;">MaxSize</span><span style="font-family:標楷體;font-size:100%;">等資訊。</span></span><br /></span></li><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWCXNIskU1MlGkowz79Ke_vaPFqRh46lujZcLICMRN-cGiPMkMFTtM5Rwf2nbbKjLXgo9KzgTxwKKP3crHlXAtx2CrXl2ylffrQZsyL9RDSRvQCPcj7W2KmoHanWQ2N_xjc8ARuA/s1600-h/connection-pool-04.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 395px; height: 190px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWCXNIskU1MlGkowz79Ke_vaPFqRh46lujZcLICMRN-cGiPMkMFTtM5Rwf2nbbKjLXgo9KzgTxwKKP3crHlXAtx2CrXl2ylffrQZsyL9RDSRvQCPcj7W2KmoHanWQ2N_xjc8ARuA/s400/connection-pool-04.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324518387827174386" /></a><span style="font-family:標楷體;font-size:100%;"><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">圖五、</span><span style="font-family:Times New Roman;font-size:100%;">ConnectionPool</span><span style="font-family:標楷體;font-size:100%;">詳細的資訊</span></span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"> <span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">JMX Console</span><span style="font-family:標楷體;font-size:100%;">提供了一個方便的介面讓我們取得資訊,<wbr>但是在資訊的呈現上並沒有提供太多的選擇。然而</span><span style="font-family:Times New Roman;font-size:100%;">jManage</span><span style="font-family:標楷體;font-size:100%;">卻<wbr>提供了以圖形化的方式來呈現所蒐集到的相關資料。透過</span><span style="font-family:Times New Roman;font-size:100%;">jMana<wbr>ge</span><span style="font-family:標楷體;font-size:100%;">可以設定要監控的</span><span style="font-family:Times New Roman;font-size:100%;">AP Server</span><span style="font-family:標楷體;font-size:100%;">,如圖六、圖七。並且可以定期來蒐集</span><span style="font-family:Times New Roman;font-size:100%;">MBean</span><span style="font-family:標楷體;font-size:100%;">內的<wbr>資訊,同時將資訊以曲線圖的方式來呈現。有關</span><span style="font-family:Times New Roman;font-size:100%;">jManage</span><span style="font-family:標楷體;font-size:100%;">的說<wbr>明可以參考附錄。</span></span></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtt3qFmrNDa42CFiof39a0qSSeGv9eRAXQOft5xytu3oFZPwuykzdSvJFSxql8mq8bfL4CYUWzSCFZ_hWgwcBTAaxnun1e68HtNAEnkGYMEcwQW9nwp7RCuGigKoRK8hpNK_6AHQ/s1600-h/connection-pool-05.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 263px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtt3qFmrNDa42CFiof39a0qSSeGv9eRAXQOft5xytu3oFZPwuykzdSvJFSxql8mq8bfL4CYUWzSCFZ_hWgwcBTAaxnun1e68HtNAEnkGYMEcwQW9nwp7RCuGigKoRK8hpNK_6AHQ/s400/connection-pool-05.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324519466069398114" /></a><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><div style="text-align: center;"><span style="font-family:標楷體;font-size:100%;">圖六、</span><span style="font-family:Times New Roman;font-size:100%;">jManage – AP Server</span><span style="font-family:標楷體;font-size:100%;">的設定</span><br /></div></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDpQRjljpOv8Nv6Gy58yMWtWMvYUTgmieRDDFdkBeAE6x-Jw1OQADCaEgFO0bK_nzpyWUaECNxmGwKCA_6ycvS0TIj7G8oQIUYJSc32sPCJAiAOMnu9KGxc4iRbxcSd4xOkLacw/s1600-h/connection-pool-06.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDpQRjljpOv8Nv6Gy58yMWtWMvYUTgmieRDDFdkBeAE6x-Jw1OQADCaEgFO0bK_nzpyWUaECNxmGwKCA_6ycvS0TIj7G8oQIUYJSc32sPCJAiAOMnu9KGxc4iRbxcSd4xOkLacw/s400/connection-pool-06.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324519572753815042" /></a><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><div style="text-align: center;"><span style="font-family:標楷體;font-size:100%;">圖七、</span><span style="font-family:Times New Roman;font-size:100%;">jManage – AP Server</span><span style="font-family:標楷體;font-size:100%;">的監控主頁面</span><br /></div></span></span></ol></span></span></div><div style="text-align: left;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><p><span style="font-family:Times New Roman;font-size:130%;"><b>Isolate connection leaks</b></span></p><p> <span style="font-family:標楷體;font-size:100%;">當確認有</span><span style="font-family:Times New Roman;font-size:100%;">Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的發生時,要如何定位確切的發生點?</span><span style="font-family:Times New Roman;font-size:100%;">JBoss JCA</span><span style="font-family:標楷體;font-size:100%;">提供了檢視目前正使用中的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">的列表。<wbr>該列表針對每個使用中(跟</span><span style="font-family:Times New Roman;font-size:100%;">Connection pool </span><span style="font-family:標楷體;font-size:100%;">取</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">但是尚未歸還者)的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;"><wbr>,詳細記錄</span><span style="font-family:Times New Roman;font-size:100%;">Stack trace</span><span style="font-family:標楷體;font-size:100%;">。也就是說當程式跟</span><span style="font-family:Times New Roman;font-size:100%;">Connection Pool</span><span style="font-family:標楷體;font-size:100%;">要了一個</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">時,會被記錄下來,<wbr>直到歸還了該</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">,記錄才會被刪除。如此一來,<wbr>便可以輕易的查出是那支程式,有</span><span style="font-family:Times New Roman;font-size:100%;">DB Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的問題。以下步驟說明如何取得使用中的</span><span style="font-family:Times New Roman;font-size:100%;">Connect<wbr>ion</span><span style="font-family:標楷體;font-size:100%;">的記錄:</span></p><ol type="1"><li><span style="font-family:標楷體;font-size:100%;">進入</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">的</span><span style="font-family:Times New Roman;font-size:100%;">JMX console</span><span style="font-family:標楷體;font-size:100%;">的首頁,並且搜尋</span><span style="font-family:Times New Roman;font-size:100%;">"<wbr>CachedConnectionManager"</span><span style="font-family:標楷體;font-size:100%;">,如圖八、<wbr>圖九所示。</span></li><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi579bOzbV_NEGXUVN2M50jD-pFsyYFkn9WFgX_1J6pvVOedTlCXAXvUIq-3ENStlP1WdisAZSqszm5Uv-Ys5GV7wLhNkDLVr7tuerLRwHwAj_mTbY5pticjI0bdPRSxHusKoXilA/s1600-h/connection-pool-07.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 312px; height: 196px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi579bOzbV_NEGXUVN2M50jD-pFsyYFkn9WFgX_1J6pvVOedTlCXAXvUIq-3ENStlP1WdisAZSqszm5Uv-Ys5GV7wLhNkDLVr7tuerLRwHwAj_mTbY5pticjI0bdPRSxHusKoXilA/s400/connection-pool-07.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324521291650798178" /></a><br /><div style="text-align: center;"><span style="font-family:標楷體;font-size:100%;">圖八、搜尋</span><span style="font-family:Times New Roman;font-size:100%;">MBean: CachedConnectionManager </span><span style="font-family:標楷體;font-size:100%;">(一)</span><br /></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family:標楷體;"><br /></span></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb627Q4DW5lGvoTykXI5pzAOlqUEzUYi3iDq5haBIA3IrG0Z1MdhlWGhLx1t4uDi4leoAMx48vH1TcBdxntf2jMxlGWclTjBveyz40tDvHajUHYbECnuh_al46IzYwvXJh1wW6bQ/s1600-h/connection-pool-08.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 306px; height: 254px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb627Q4DW5lGvoTykXI5pzAOlqUEzUYi3iDq5haBIA3IrG0Z1MdhlWGhLx1t4uDi4leoAMx48vH1TcBdxntf2jMxlGWclTjBveyz40tDvHajUHYbECnuh_al46IzYwvXJh1wW6bQ/s400/connection-pool-08.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324521171136140690" /></a><span style="font-family:標楷體;font-size:100%;"><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">圖九、搜尋</span><span style="font-family:Times New Roman;font-size:100%;">MBean: CachedConnectionManager </span><span style="font-family:標楷體;font-size:100%;">(二)</span></span><br /></div></span><br /><br /><li><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">點選搜尋到的</span><span style="font-family:Times New Roman;font-size:100%;">" CachedConnectionManager"</span><span style="font-family:標楷體;font-size:100%;">,即可看到該</span><span style="font-family:Times New Roman;font-size:100%;"><wbr>MBean</span><span style="font-family:標楷體;font-size:100%;">所提供的詳細資訊。並且該</span><span style="font-family:Times New Roman;font-size:100%;">MBean</span><span style="font-family:標楷體;font-size:100%;">有提供一個</span><span style="font-family:Times New Roman;font-size:100%;">"<wbr>listInUseConnections"</span><span style="font-family:標楷體;font-size:100%;">操作,如圖十。點選</span><span style="font-family:Times New Roman;font-size:100%;"><wbr>"Invoke"</span><span style="font-family:標楷體;font-size:100%;">即可得到現在正在使用中的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;"><wbr>列表。如圖十一。</span></span><br /></span></li><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEingv4XkH6vbwjNQ5zlPkszzhRbJzL6RnF9kgL-LFU8kXVAqzyhZ0XrB4HYdk168GIUpQuCN9RyjqnvPgeFGqaRb77dB1pTCXs5iCsIdegxuvVRCka89INynXXlR9DkCf9-ctZyVg/s1600-h/connection-pool-09.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 189px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEingv4XkH6vbwjNQ5zlPkszzhRbJzL6RnF9kgL-LFU8kXVAqzyhZ0XrB4HYdk168GIUpQuCN9RyjqnvPgeFGqaRb77dB1pTCXs5iCsIdegxuvVRCka89INynXXlR9DkCf9-ctZyVg/s400/connection-pool-09.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324522247405190866" /></a><span style="font-family:標楷體;font-size:100%;"><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">圖十、</span><span style="font-family:Times New Roman;font-size:100%;">CachedConnectionManager</span><span style="font-family:標楷體;font-size:100%;">的詳細資<wbr>訊與操作</span></span><br /></div></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6IlILspyZCAkCZRNU_sCcfpWhAtoEN1chyphenhyphen4uI9y8ZrRZXgYMkC2mQQGYeZkYw4JY5BkUlBb307dn1cOC_AMvlX05gX7z3UDqdiIiY1KiSTp-6_hZ7qWKBOy4NvaLu5YsOz_eL0A/s1600-h/connection-pool-10.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6IlILspyZCAkCZRNU_sCcfpWhAtoEN1chyphenhyphen4uI9y8ZrRZXgYMkC2mQQGYeZkYw4JY5BkUlBb307dn1cOC_AMvlX05gX7z3UDqdiIiY1KiSTp-6_hZ7qWKBOy4NvaLu5YsOz_eL0A/s400/connection-pool-10.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5324522134834794850" /></a><span style="font-family:標楷體;font-size:100%;"><div style="text-align: center;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">圖十一、正在使用中的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">列表</span></span><br /></div><div style="text-align: center;"><br /></div></span><li><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><span style="font-family:標楷體;font-size:100%;">過濾列表中可疑之</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">使用項目。例如,在</span><span style="font-family:Times New Roman;font-size:100%;">Sta<wbr>ck trace</span><span style="font-family:標楷體;font-size:100%;">中找尋是否有過多的</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">,被同一個</span><span style="font-family:Times New Roman;font-size:100%;">C<wbr>lass</span><span style="font-family:標楷體;font-size:100%;">與</span><span style="font-family:Times New Roman;font-size:100%;">Method</span><span style="font-family:標楷體;font-size:100%;">所使用。另外,在搭配</span><span style="font-family:Times New Roman;font-size:100%;">Code review</span><span style="font-family:標楷體;font-size:100%;">即可確認問題點。</span></span></span></li></ol><div><span class="Apple-style-span" style="font-family:標楷體;"><span class="Apple-style-span" style=" ;font-family:'Times New Roman';"><p><span style="font-family:Times New Roman;font-size:130%;"><b>Conclusion</b></span></p><p> <span style="font-family:標楷體;font-size:100%;">本文提供了</span><span style="font-family:Times New Roman;font-size:100%;">DB Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的檢測與定位的方式,該方式主要架構在</span><span style="font-family:Times New Roman;font-size:100%;">JBoss JCA</span><span style="font-family:標楷體;font-size:100%;">的功能上。基本上只要使用</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">內建的</span><span style="font-family:Times New Roman;font-size:100%;">Connect<wbr>ion Pool</span><span style="font-family:標楷體;font-size:100%;">,我們就能夠按照上述的各種方式來做檢測。並且使得,<wbr>系統內部使用</span><span style="font-family:Times New Roman;font-size:100%;">Connection</span><span style="font-family:標楷體;font-size:100%;">的狀況更加透明、<wbr>更可以被控制與管理。</span></p><p> <span style="font-family:標楷體;font-size:100%;">對於</span><span style="font-family:Times New Roman;font-size:100%;">Developer</span><span style="font-family:標楷體;font-size:100%;">而言,該檢測的方式提供詳細的</span><span style="font-family:Times New Roman;font-size:100%;">C<wbr>onnection</span><span style="font-family:標楷體;font-size:100%;">的使用記錄,可用來檢視自己所負責的</span><span style="font-family:Times New Roman;font-size:100%;">code</span><span style="font-family:標楷體;font-size:100%;"><wbr>是否有</span><span style="font-family:Times New Roman;font-size:100%;">Connection leaks</span><span style="font-family:標楷體;font-size:100%;">的問題。對於前端的人員而言,除了檢測</span><span style="font-family:Times New Roman;font-size:100%;">Connect<wbr>ion leaks</span><span style="font-family:標楷體;font-size:100%;">的問題外,還可以使用該方式監控</span><span style="font-family:Times New Roman;font-size:100%;">Server</span><span style="font-family:標楷體;font-size:100%;">內部資源<wbr>使用的狀況,進而調整相關參數進行最佳化。</span></p><p> <span style="font-family:標楷體;font-size:100%;">對於無法使用</span><span style="font-family:Times New Roman;font-size:100%;">JBoss</span><span style="font-family:標楷體;font-size:100%;">內建之</span><span style="font-family:Times New Roman;font-size:100%;">Connection Pool</span><span style="font-family:標楷體;font-size:100%;">。建議應該也要提供相關偵測功能,<wbr>並且提供相關介面來取得必要之資訊,<wbr>特別是在定位錯誤發生之問題上。該部分建議參考</span><span style="font-family:Times New Roman;font-size:100%;">JBoss JCA</span><span style="font-family:標楷體;font-size:100%;">相關的</span><span style="font-family:Times New Roman;font-size:100%;">Source code: "org.jboss.resource.<wbr>connectionmanager.<wbr>CachedConnectionManager"</span><span style="font-family:標楷體;font-size:100%;">中</span><span style="font-family:Times New Roman;font-size:100%;">regis<wbr>terConnection</span><span style="font-family:標楷體;font-size:100%;">與</span><span style="font-family:Times New Roman;font-size:100%;">unregisterConnec<wbr>tion</span><span style="font-family:標楷體;font-size:100%;">之方式來達成。</span></p></span></span></div></span></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-22821695.post-80639956644097874112006-11-06T13:52:00.003+08:002009-04-14T21:11:39.072+08:00Java Profiler - YourKit Java Profiler(二)<span style="font-family:Times New Roman;"><p><span class="Apple-style-span" style="font-weight: bold; ">Telemetry</span><br /></p><br />當我們開起YourKit 並且連線到要監控與Profiling 的Java Application 後,第一個看到的頁面就是Telemetry 的頁面。頁面中可以看到一些On-line 的數據,其中包含有:CPU & Memory、Garbage Collection、Classes、Threads、Summary。暫且先不管這些數據的用途、與意義,YourKit 會在AP 一起動就開始記錄這些Telemetry。只要AP 不停,一旦YourKit 連上該AP,這些數據都會完整的被呈現在YourKit中。這是一的不錯的優點,因為有些Profiler 並沒有做到這個功能。而這對我們保存完整的Telemetry 以供爾後分析是很重要的。不過,就如同之前所說的,我們只能用YourKit 手動的來保存Telemetry。並沒有辦法用Off-line 的方式來保存這是很可惜的地方。下圖為Telemetry 的頁面:<br /><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/1.1.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/1.1.jpg" border="0" alt="" /></a><br /><br />在上圖中我們可以看到兩個主要的資訊:CPU utilization 與Memory usage。一般來說,大多的Profiler 比較少提供CPU 的使用率,不過YourKit 倒是有提供。CPU 使用率對我們而言有什麼重要的意義呢?在Wait-based tuning approach 中,CPU utilization 是一個相當重要的指標,特別是在調整Thread Pool 的時候。一般建議,CPU utilization 在正常使用情況下,最好是保持在80-85% 左右。透過觀察CPU utilization 與Thread Pool utilization 以便調整 Pool size,使CPU utilization 能夠達到較佳的狀態,提升整體性能。<br /><br />在Memory Usage 的部分,YourKit 提供了Heap 與Non-Heap Memory 的相關資料。Memory 相關的圖表能夠顯示記憶體隨著時間被使用的狀況。大約是JDK 1.2 以後,Sun 提出了Generation garbage collection 的概念。Heap Memory 大略被分成Young Generation 與Old Generation,越老的Java Object會被劃分到Old Generation 中。一般來說,檢查有沒有Memory leaks 最有效的方法就是監控Old Generation 的Memory usage 趨勢。但是在YourKit 並沒有根據Generation 來分開統計,有點遺憾。當然這是不是為了要考量到不同的JVM implementation 而所妥協出來的功能就不得而知,因為每個非Sun 的JVM 是如何來做或者是不做Generation garbage collection 這個老泰就不清楚了。<br /><br />Garbage Collection 的功能主要是用來監測Garbage Collector 的負載。至於什麼叫做負載過重,這個老泰也不知道...哈哈哈,請大家自己判斷囉。而根據手冊上的介紹,如果發現過多的資源花費在Garbage Collection 時,這表示有過多的暫存物件被產生,所以可以透過一些方式來定位哪些Object,在什麼Method 所建立的。這可以用來將Code 最佳化,並減少不必要的暫存物件產生。下圖是有關Garbage Collection 的相關圖表頁面。該頁面分成三個部分:GC 所耗費的時間、Minor collection、與Major collection。<br /><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/aa.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/aa.jpg" border="0" alt="" /></a><br /><br />有關Minor 與Major collection 的差異,老泰也不是非常的清楚。唯一知道的是,Major collection 時會暫停所有的Thread 以便來'清理'整個Heap Memory。所以可以由此而知Major collection 對整個系統Performance 的影響是相當大的。至於何時會啟動Major collection?老泰看了一些文章,似乎沒有一篇寫的是一樣的,所以相當的混淆。當然,有關於Grabage Collector 的Implement 本來就是每個JVM implementation 不盡相同,所以說法不見得一致。<br /><br />大部分的Profiler 都有提供有關目前Class 載入的數量。YourKit 也不例外,如下圖所示。這個功能到目前為止,老泰還沒能感受到他真正的用處。不過該功能可以與Memory Usage 的資訊來做相互參考。因為載入的Classes 是被放置在Non-Heap Memory 中。所以如果發現Non-Heap Memory 的使用過大時,可以檢查一下是否是因為AP 的Classes 過多所造成的。<br /><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/ab.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/ab.jpg" border="0" alt="" /></a><br /><br />同樣的大部分的Profiler 也都有提供目前Thread 的數量,以供監測。YourKit 提供了基本的Thread 數量的資訊,但是有關其它Thread 相關的功能,可以說是相當的薄弱。有些Profiler 除了這個基本的功能外,對Thread 的部分還加上了Thread lock 監控、Thread 狀態等,如JProfiler、JRockit 等。Thread 的數量對我們有什麼意義?老泰說:『就是要看現在有多少Thread 還活著,Thread 數量的高峰在哪裡』。真是廢話!說了跟沒說一樣。<br /><br />Thread 的數量影響著整個系統的Performance。Thread 過多,會造成CPU 的Switch Cost 過高,所以分配給每個Thread 的時間自減少。Thread 過少,會造成CPU utilization 過低,浪費了CPU 的能力。Steven Haines 的"Pro Java EE 5 Performance Management and Optimization"一書中有詳細的說明,老泰就不多嘴了。而這個功能是否對Performance tunning 有幫助呢?這個老泰目前還沒有感受到,也正在摸索中,請大家自己判斷囉。<br /><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/ac.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/ac.jpg" border="0" alt="" /></a><br /><br />老泰對Thread 的檢測曾經吃過一次苦頭。有個客戶發生一件奇怪的現象,就是AP 大約Run 個三天,就會發現Client 向Server 發出的Request 沒有都反應,但是卻沒有任何Exception。老泰到了現場,才發現。現場只要發生No response 的情況,Thread 的數量會持續的遞增。想想如果發生這種情況,YourKit 了不起只能顯示出Thread 數量的異常,但是卻沒有辦法協助來定位問題點。不過當然還是有別的辦法取得當下Thread 的狀況啦,但是如果有工具的話會就方便。<br /><br />最後,有關Telemetry 的部分。YourKit 提供一個Summary 的介面,以方便來看到這個AP 目前的整體狀況,如下圖。這個頁面大略顯示出上面所有提到有關該AP 的概要資訊。<br /><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/ad.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/ad.jpg" border="0" alt="" /></a><br /><br /><br /><strong>Resources</strong><br /><ul><li>Solving common Java EE performance problems, Steven Haines, JavaWorld.com, 06/19/06, <a name="r001" href="http://www.javaworld.com/javaworld/jw-06-2006/jw-0619-tuning.html">http://www.javaworld.com/javaworld/jw-06-2006/jw-0619-tuning.html</a></li><br /></ul><br /><br /><br /><p></p><br /><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-22821695.post-59919708090372069702006-10-27T12:14:00.000+08:002006-11-07T14:38:33.323+08:00Java Profiler - YourKit Java Profiler(一)<span style="font-family:Times New Roman;"><br /><p><span style="font-size:85%;"><strong><em>閒話家常</em></strong><br/><br />這幾天有個同學訂婚,老泰與泰嫂參加了喜宴。參加這種聚會,大家難免會聊聊近況。但老泰萬萬沒想到,在酒足飯飽後,泰嫂竟然在所有同學面前,說老泰在公司有多閒,而且閒到在寫Blog。一向行事低調的老泰當場愣住,急忙之下就當場教訓起泰嫂,就這樣害老泰被冠上打老婆的罪名。其實,全世界的人都可說老泰很閒,只有泰嫂不行。因為,家裡大大小小的東西,都是這個傢伙上網買來了,嘿嘿.....不用想也知道是什麼時間買的。上班無聊就上網逛一逛,不時老泰的MSN 都會跳出許多各式各樣產品的URL。幹什麼呢?就是要老泰給個建議,看要買哪一種好。更厲害的來了,最近知道老泰開始寫Blog,泰嫂竟然無聊到在催老泰的槁。挖哩咧......</span></p><hr style="height: 1px;color: #e0e0e0;text-align: center;width: 99%;" /><br /><p><strong>一、前言</strong><br/><br />前一陣子老泰被拐到大陸去。本來說是有好料的,結果去了後才曉得又是很'賽'的工作 - 幫別人擦屁股的工作。原來是公司的產品在客戶哪裡出了些問題,弄的客戶有點不爽。其中有個問題比較機車,老泰跟它交手過幾回,結果都無疾而終。這次發誓不搞定它就不回台灣。公司的產品很特別,在公司內部怎麼測都沒問題。一正式上Production 就問題一狗票,當然有可能是每個客戶,都會對該產品有些客製化的原因。這次又在某個客戶端發現可能有Memory leak 的問題。<br/><br />老泰真的很遜,一個Memory leak的問題處理了幾次都還搞不定。之前老泰用了Eclipse - Test & Performance Tools Platform(TPTP),嘗試在Production env. 來定位問題點,結果呢?整個Production 的Performance 整個都down 了下來,那時候可真是嚇壞老泰了。真是豬頭,誰叫你去客戶Production env. 搞這個東西。正常人都是在自己家裡頭弄,你這不是找死嗎?唉...老泰真的也是出自無奈,是真的沒有辦法在自己家裡reproduce 出這種情況,所以只好到客戶端搞搞它。就是搞不懂客戶怎麼那麼厲害,可以走到那些有問題的call path 。總之,之前用了TPTP 的經驗是:<br/><br /><ul><li>不適合在Production env. 來監測(Performance的影響相當大)</li><br /><li>操作複雜(尋找Memory leak 與Performance bottleneck 的方法較為複雜)</li><br /><li>支援 的平台有限(Profiler 大多與native lib有關,所以是否提供完整、各個平台的lib,相當重要)<br /></li></ul>當然,那個時候TPTP 還沒有final release。所以老泰用的是beta的版本啦,所以可能給人的感覺不好。另外,那個時候TPTP 還是使用JVMPI 來做profiling,相信這個也是影響Performance的因素之一。不過,好像後來已經有用JVMTI 來implement 了。<br/><br />經過上次使用TPTP在 Production evn. 的經驗後,迫使老泰繼續尋找好用的Java Profiler。而YourKit Java Profiler就是其中一套,老泰覺得不錯,而且還蠻適合在Production env. 上監控AP、與進行Profiling 的工具。總結他的特點,就是light-weight,操作夠直覺。</p><br /><p><strong>二、Java Profiler</strong><br/><br />Java Profiler是幹啥用的?什麼時候要用它呢?老泰對Java Profiler的定義是:在不改動任何程式碼的情況下,來觀察與分析Runtime 的Java Application。觀察的項目可能包含:CPU、Memory、Thread 等。簡單的來說就是用來找碴的啦。用途很廣,有人用它來找出Memory leak、Performance bottleneck、Thread lock等問題。有人用它來瞭解程式碼在Runtime 的行為,更進階的用途是幫忙分析並破解Java Application 的License 限制...哈哈哈。當然還有其它的用途,像是涵蓋率分析、執行順序分析、記憶體使用分析等等。<br/><br />當然,不是每一家都有這些功能,各家可能有各家的賣點。不過,大多數都有協助找出Memory leak、Performance bottleneck 的功能。</p><br /><p><strong>三、YourKit Java Profiler</strong><br/><br />YourKit 的操作相當的直覺,設定的部分也蠻簡單的,如下圖所示。主要有兩大功能:CUP Profiling、Memory Profiling,並且可以對Java ME、SE、EE 的Application 來做Profiling。下圖的左上角即可以選擇,所要連接到的Application 位置或型態。<br/><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/1.0.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/1.0.jpg" border="0" alt="" /></a><br /><strong>Configuration</strong><br/><br />有些Profiler在使用上,較為麻煩。必須先啟動Profiler,並且在Profiler 內部設定專案、Binary code、Source Code、Class path...等,最後必須在Profiler 內部啟動被監控的程式。整個過程相當麻煩。然而,YourKit則非常的簡單,只需要在java 後加入一些參數即可。以下是針對JDK 1.5 以上的版本的設定<br/><br /><div class="source"><pre>set PATH=%PATH%;C:\javasoft\YourKit Java Profiler 5.5.4\bin\win32<br />set JAVA_OPTS= -agentlib:yjpagent=cpu=times,onexit=cpu<br />,usedmem=89,dir=C:\YourKit\log<br /><br />java %JAVA_OPTS% You_Main_Class<br /></pre></div>or<div class="source"><pre>set JAVA_OPTS= -agentpath:C:\YourKit\win32\yjpagent.dll=cpu=times,<br />onexit=cpu,usedmem=89,dir=C:\YourKit\log<br /><br />java %JAVA_OPTS% You_Main_Class</pre></div><br />我們可以選擇上述其中一種方式來設定。設定完成後,只需啟動該程式即可使用YourKit 的漂亮GUI來進行操作了。在上述設定中"=cpu=times, onexit=cpu, usedmem=89, dir=C:\YourKit\log"的參數主要是用來進行Off-line Profiling。YourKit 的設計中Off-line Profiling 的功能相當好用、設定也簡單。特別是運用在Production env. 中,客戶絕對感覺不到你有使用Profiler。在啟動程式時,只需跟平常一樣執行程式,不需要其它的操作。當然,也不能亂設定,不然在Performance 的表現上肯定會有感覺。<br/><br />一般On-line Profiling 的操作並不需要加上"=cpu=times, onexit=cpu, usedmem=89, dir=C:\YourKit\log",也可以將它去除。大略說明一下相關的參數:<br/><br /><ul><li><strong>cpu=times/full</strong> - 程式一開始後,立刻進行CPU Profiling。</li><br /><li><strong>usedmem</strong> - 在Heap memory 的使用量達到某一個百分比時,自動抓取Memory snapshot。</li><br /><li><strong>onexit=cpu/memory/both</strong> - 在程式結束前,抓取CPU snapshot/Memory snapshot/CPU & Memory snapshot。</li><br /><li><strong>dir</strong> - CPU & Memory snapshot存放的路徑。</li></ul><br />上面只是簡單的說明一些參數,詳細的使用及參數間的相依性,還是要參考一下YourKit 的手冊。設定完成後,就可以啟動你的程式。接下來,請開啟YourKit,如果你的程式放在Local,請點選"Connect to locally running profiled application..."。如果是跟YourKit 放在不同一台機器,則點選"Connect to remote application..."。那最後一個呢?幹嘛用的?怎麼用?嘿嘿...不知道,沒用過。下圖為"Connect to remote application..."時,必須輸入Remote IP 位置。<br/><br /><a href="http://photos1.blogger.com/blogger2/6975/2785/1600/2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger2/6975/2785/400/2.jpg" border="0" alt="" /></a><br />雖然Off-line Profiling 允許儲存CPU & Memory snapshot,但美中不足的是,不能把Telemetry 的資料也給存下來。可惜,可惜...。<br/><br /><br /><strong><em>To Be Continued......</em></strong><br /><br /></p><br /><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-22821695.post-1161140379735666902006-10-18T10:41:00.000+08:002006-10-19T15:23:01.912+08:00License Management - Protection! Licensing Framework for Java<p align="left"><span style="font-family:times new roman;"><strong>一、前言</strong></span><br /><strong><span style="font-family:Times New Roman;"></span></strong><br /><span style="font-family:times new roman;">老泰最近收到老闆的命令,說是要研究一下公司產品的License 管理。可能是因為最近產品要部署到非Windows 的環境,所以才發現原本License 管理的架構要porting 到Unix-like 的環境很麻煩。所以放眼望去全公司只有老泰,身上穿著短袖、短褲,腳下踩著夾腳鞋,手上拿個扇子還在那煽啊煽......就是這傢伙,過太爽。就這樣工作就派到老泰的頭上。</span><br /><br /><span style="font-family:Times New Roman;">不知道這算好還是壞,以前沒玩過這方面的東西,能夠玩玩也不錯。但是又想想,每次為了產品study 或 survey新的技術或工具都很累,特別是非常傷眼力、腦力。總而言之,心裡很矛盾。說起來,搞產品的人還真命苦。做個產品因為怕人Decompile 竊取公司的資產,所以還要搞個Code protection。再來就是還得弄個Installer,方便客戶安裝。這還不夠,又怕客戶不付錢,還要做個License 管理。想到就辛苦,還是做專案好。</span><br /><br /><span style="font-family:times new roman;">說實在的,中國人特別討厭License Management。老泰在網路上找了半天,沒有幾篇中文網頁再討論這個話題。就算有也只是一兩行,敷衍的帶過。另外,找了幾個做License Management的產品,想說大陸的網站上很多都有提供'合法測試用的序號'。沒想到什麼軟體工具都有,就是找不到有關License Management的。想想也對,中國有13億人口,可能將近一半的人在幹'破解'這一行。自然根本不會有這類軟體的需求,難怪找不到。</span><br /><br /><span style="font-family:times new roman;"><strong>二、License Management</strong></span><br /><strong><span style="font-family:Times New Roman;"></span></strong><br /><span style="font-family:Times New Roman;">License Management 不知道要怎麼定義。老泰的定義是:License Management 是要告訴客戶,誰是老大,並且在客戶付錢之前,先給客戶一些甜頭,但是又不能過頭的一種軟體保護機制。總之它主要的目的是要達到</span><br /><span style="font-family:Times New Roman;"></span></p><ol><li><div align="left"><span style="font-family:Times New Roman;">Copy protection</span></div></li><li><div align="left"><span style="font-family:Times New Roman;">Demo license conrtol</span></div></li><li><div align="left"><span style="font-family:Times New Roman;">Feature control</span></div></li><li><div align="left"><span style="font-family:Times New Roman;">User licensing</span></div></li></ol><p align="left"><span style="font-family:Times New Roman;">這些是基本大多廠商提供的功能,當然根據每個License Management產品的不同也有提供自家獨有的賣點,如License 後端管理功能是否健全完善、License delivery的機制等。</span></p><p align="left"><strong><span style="font-family:times new roman;">三、Protection! Licensing Framework for Java</span></strong></p><div align="left"><span style="font-family:times new roman;">老泰對Protection! 的瞭解並不深,目前還是停留在功能的研究。還沒有正式開始下去implement ,因為懶.......。所以不用期待會有多深入的探討。當然,老闆的態度也很重要,這決定了老泰是不是要對該產品深入的瞭解。</span><span style="font-family:times new roman;"> </span><br /><span style="font-family:Times New Roman;"></span><br /><span style="font-family:Times New Roman;">Protection! 是一組Java-based的Framework。這是他們非常強調的,也就是說。不是你買來,用了他們的工具,滑鼠拖拉一下,按個按鈕License就做完了。還必須靠Developer 來給它'整合'一下。Protection! 給人的感覺是很簡單,沒有太過複雜的設定、也沒有必要架設複雜的License Sever。這是最令人感到高興的。</span> 簡單說一下它的功能,可以說他大致上都涵蓋了上述的四個目的 <span style="font-family:times new roman;">- Copy Protection, Demo License Control, Feature Control, User Licensing。廣度大至上是做足夠了,深度做到什麼樣的程度?老泰現在也說不准,大家自己判斷好了。但是除了基本的功能外,Protection!也做足了有關License Delivery的機制。以及對某些Resource 做CRC 判斷的功能。這應該算是有些加分的效果吧。</span> </div><div align="left"><br /><span style="font-family:times new roman;">其實最令老泰感興趣的是有關Floating License這功能是怎麼做到的。特別印象深刻的是,手冊上寫Protection! 在驗證License 時是UDP 來Broadcasting 給所有的User。然後分析每個user 的response,最後如果超過了人數的上限,再呼叫某個Interface 的某個Method。如此一來,就不用有License Server,架構也簡單許多。但是,整個機制是怎麼做到的?有沒有什麼限制?恐怕還是要實際implement 後才會有明確的答案。或許過兩天有空,研究一下Protection! 是怎麼做到的在跟大家報告一聲。</span></div><p align="left"><span style="font-family:times new roman;">另外有個有趣的東西是CRC檢驗的功能。在Protection! 手冊裡提到,該功能可以有效避免惡意的更新程式。這個基本上的概念並不難,但是實際在提供這個功能時Protection! 似乎並不周全。當然很有可能是老泰並不瞭解。CRC的驗證是根據使用者所選擇要做的資源為對象,來進行SHA-1或MD5演算。然後,再進行License的驗證前,先驗證這些資源的完整性,使否有被非法的惡意程式修改或置換。但是,Protection! 在保存這個Digest 時並沒有特別的處理。並且將這些必須驗證的資源與這個Digest放在同一個Class 裡面。這就是不能理解的地方了。這樣做只要有心人士換掉這個Class,那麼CRC驗證的功能就形同廢物。當然,可能是老泰還沒弄懂之間的奧秘吧。阿彌陀佛.....#$%^</span></p><p align="center"><a href="http://photos1.blogger.com/blogger/4237/2327/1600/1.0.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/1.jpg" border="0" /></a><span style="font-family:times new roman;">上圖為Protection! 的Control Center。什麼東西啊?說明白了就是License Generator,就是幫你產生License的工具。這個工具最主要的功能就是幫你產生License file。至於怎麼在你的產品裡面做驗證,這個還得要靠Developer。當然,Protection! 有一組API 來做這件事,所以放心,不難做。</span></p><p align="center"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/2.jpg" border="0" /> </p><p align="center"><span style="font-family:times new roman;">在為你的產品產生License前,必須先設定產品基本的資料。</span><br /></p><p align="center"><a href="http://photos1.blogger.com/blogger/4237/2327/1600/4.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/4.jpg" border="0" /></a> <span style="font-family:times new roman;">Feature Control相關的設定介面。</span><br /></p><p align="center"><a href="http://photos1.blogger.com/blogger/4237/2327/1600/5.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/5.jpg" border="0" /></a><span style="font-family:times new roman;">設定不同的Edition有什麼樣的Feature</span>。</p><a href="http://photos1.blogger.com/blogger/4237/2327/1600/3.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/3.jpg" border="0" /> <p align="center"></a></p><p align="center"><span style="font-family:times new roman;">Copy Protection相關設定的介面。如上圖'Lock License to'的區域。</span> </p><p align="center"></p><p align="center"><a href="http://photos1.blogger.com/blogger/4237/2327/1600/6.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/6.jpg" border="0" /></a><span style="font-family:times new roman;"> CRC相關的設定介面,在視窗的上面可以增加要保護的資源檔案與路徑。視窗中間有可以產生Digest的按鈕,該按鈕可以自動幫你修改下面的code snippet。</span><br /><br /></p><p align="center"><a href="http://photos1.blogger.com/blogger/4237/2327/1600/7.jpg"><img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/4237/2327/400/7.jpg" border="0" /></a><span style="font-family:times new roman;"> 該介面根據設定來產生License file,這個介面可以設定Demo license control與User licensing。<br /></span><br /></p>Unknownnoreply@blogger.com0