7.1附錄1:執(zhí)行性能測(cè)試基本原則原則一:測(cè)試前,要確認(rèn)系統(tǒng)級(jí)的關(guān)鍵參數(shù)已經(jīng)基本配置正確(例如:數(shù)據(jù)庫(kù)、WEB容器、線程池、JDBC連接池、對(duì)象池、JVM、操作系統(tǒng)、應(yīng)用系統(tǒng)等配置); 原則二:測(cè)試前,要確保測(cè)試腳本的業(yè)務(wù)功能運(yùn)行正確。 原則三:測(cè)試前,清空所有應(yīng)用日志、調(diào)高錯(cuò)誤日志的輸出級(jí)別(Error級(jí)),必要時(shí)在每次測(cè)試前重啟應(yīng)用服務(wù)和數(shù)據(jù)庫(kù)應(yīng)用服務(wù); 原則四:調(diào)整系統(tǒng)參數(shù)時(shí),一次只調(diào)整一個(gè),不要同時(shí)調(diào)整多個(gè),并記錄調(diào)整前后的系統(tǒng)變化。 原則五:優(yōu)先測(cè)試基線案例。
7.2附錄2:性能問題分析原則原則一:把事實(shí)與推測(cè)分開,總是用實(shí)際的證據(jù)來證明你的推測(cè); 原則二:在沒有足夠證據(jù)之前,不對(duì)程序進(jìn)行優(yōu)化; 原則三:優(yōu)先驗(yàn)證簡(jiǎn)單的假設(shè); 原則四:日志文件中沒有錯(cuò)誤不代表真的沒有錯(cuò)誤; 原則五:從系統(tǒng)到應(yīng)用、從外到內(nèi)進(jìn)行層層剝離,縮小范圍。 確認(rèn)是系統(tǒng)級(jí)問題還是應(yīng)用級(jí)問題; 確認(rèn)是否外部系統(tǒng)問題(如密碼鑒權(quán)問題、EJB問題等); 確認(rèn)是應(yīng)用程序問題還是數(shù)據(jù)庫(kù)問題。 原則六:范圍縮小后,再分割成多個(gè)小單元,對(duì)每個(gè)小單元進(jìn)行輪番壓力測(cè)試,來證明或者否定是那個(gè)單元引起性能問題。
7.3附錄3:常見性能問題及成因常見性能問題的六個(gè)特征 ① 持續(xù)緩慢:應(yīng)用程序一直特別慢,改變負(fù)載,對(duì)整體響應(yīng)時(shí)間影響很少; ② 隨著時(shí)間推進(jìn)越來越慢:負(fù)載不變,隨著時(shí)間推進(jìn)越來越慢,可能到達(dá)某個(gè)閾值,系統(tǒng)被鎖定或出現(xiàn)大量錯(cuò)誤而崩潰; ③ 隨著負(fù)載增加越來越慢:每增加若干用戶,系統(tǒng)明顯變慢,用戶離開系統(tǒng),系統(tǒng)恢復(fù)原狀; ④ 零星掛起或異常錯(cuò)誤:可能是負(fù)載或某些原因,用戶看到頁(yè)面無法完成并掛起,無法消除; ⑤ 可預(yù)見的鎖定:一旦出現(xiàn)掛起或錯(cuò)誤,就加速出現(xiàn),直到系統(tǒng)完全鎖定。通常要重啟系統(tǒng)才解決。 ⑥ 突然混亂:系統(tǒng)一直運(yùn)行正常,可能是一個(gè)小時(shí)或三天之后,系統(tǒng)突然出項(xiàng)大量錯(cuò)誤或鎖定。
常見性能問題成因 常見性能問題及成因列表:
7.4附錄4:常用監(jiān)控指標(biāo)診斷性能問題,需要清楚監(jiān)控的關(guān)鍵指標(biāo),以此輔助試驗(yàn)診斷,最后驗(yàn)證推測(cè)。 常用監(jiān)控的關(guān)鍵指標(biāo) 可見性: Memory、CPU、DISKIO的指標(biāo)可以使用操作系統(tǒng)提供的工具來監(jiān)控。 Java堆棧:可以打開verbose:gc 開關(guān)來監(jiān)控,也可以用更直觀的Jprofiler監(jiān)控工具。 計(jì)時(shí): LoadRunner工具有事務(wù)計(jì)時(shí),組件或方法的計(jì)時(shí)可以用Jprofiler監(jiān)控工具,或者應(yīng)用程序加debug觀察。 內(nèi)部資源: 監(jiān)控線程池、數(shù)據(jù)庫(kù)連接池、對(duì)象池等資源分配的數(shù)量、使用的數(shù)量、等待的數(shù)量、死亡的數(shù)量、消耗的時(shí)間等等。 提示:內(nèi)部資源的監(jiān)控對(duì)診斷性能問題起到至關(guān)重要的作用。 WebLogic自帶的監(jiān)控工具,基本滿足對(duì)內(nèi)部資源的監(jiān)控。 也可以用Jprofiler監(jiān)控線程的使用,監(jiān)控對(duì)象、方法動(dòng)態(tài)占有內(nèi)存的信息。 自編的數(shù)據(jù)庫(kù)連接池或使用tomcat等的數(shù)據(jù)庫(kù)連接池,需要在應(yīng)用程序中加上debug觀察動(dòng)態(tài)使用信息。 外部資源: 例如EJB外部資源,監(jiān)控對(duì)外部資源連接的數(shù)量、使用數(shù)量、等待的數(shù)量、消耗的時(shí)間等等。 WebLogic自帶的監(jiān)控工具,基本滿足對(duì)外部部資源的監(jiān)控。 可以在應(yīng)用程序中加上debug觀察外部資源動(dòng)態(tài)使用信息。 可以用外部資源自帶工具監(jiān)控外部資源。
7.5附錄5:如何診斷數(shù)據(jù)庫(kù)的性能問題是應(yīng)用程序還是數(shù)據(jù)庫(kù)? 診斷性能問題,最常見的也是較難的判斷是:是應(yīng)用程序還是數(shù)據(jù)庫(kù)?或者兩者都有? 難在那里? 是因?yàn)閼?yīng)用程序、數(shù)據(jù)庫(kù)、WebLogic Server(Tomcat)都不是在孤立地運(yùn)轉(zhuǎn)的。因此脫離應(yīng)用架構(gòu)單獨(dú)運(yùn)行測(cè)試諸如SQL計(jì)時(shí)、JDBC計(jì)時(shí)、線程計(jì)時(shí)等等幾乎沒有作用。 關(guān)鍵是對(duì)相互作用的了解 要熟知系統(tǒng)的性能度量; 提示:系統(tǒng)性能度量參見附錄4:常見監(jiān)控指標(biāo) 了解SQL的結(jié)構(gòu); 提示:SQL結(jié)構(gòu)可參閱文檔《OracleSQL性能優(yōu)化指南.doc》 了解用戶發(fā)出的請(qǐng)求在跨越整個(gè)系統(tǒng)時(shí)的端對(duì)端、點(diǎn)對(duì)點(diǎn)計(jì)時(shí)、SQL的計(jì)時(shí)等; 了解用戶發(fā)出的請(qǐng)求后所關(guān)聯(lián)的線程、JDBC連接、數(shù)據(jù)庫(kù)的活動(dòng)及其之間的交互關(guān)系;
典型的應(yīng)用數(shù)據(jù)庫(kù)問題 典型應(yīng)用數(shù)據(jù)庫(kù)問題的三個(gè)類型:過量的數(shù)據(jù)庫(kù)調(diào)用、數(shù)據(jù)庫(kù)連接池問題、SQL語句及其索引或鎖定屬性問題。 過量的數(shù)據(jù)庫(kù)調(diào)用 問題 很常見的性能瓶頸來是自過量的數(shù)據(jù)庫(kù)調(diào)用,引發(fā)這些問題不一定是SQL查詢的Execute()或Update(),而是應(yīng)用程序與數(shù)據(jù)庫(kù)的交互有關(guān),例如ResultSet操作,常見的問題是指定了過于精細(xì)的查詢條件,然后使用ResultSet.Next()詳細(xì)搜尋返回的數(shù)據(jù),每次一行。 解決辦法 從數(shù)據(jù)庫(kù)中大批取得所要求的數(shù)據(jù),避免應(yīng)用程序反復(fù)回調(diào)數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)連接池問題 問題1:連接池資源泄漏 雖然可以通過WebLogic自帶工具或Jprofiler工具或自編工具檢測(cè)到數(shù)據(jù)庫(kù)連接池資源泄漏,但是,很難在應(yīng)用程序代碼本身準(zhǔn)確定位泄漏的源頭! 問題1解決辦法 仔細(xì)分析程序代碼,是否沒有close()連接?或者遺漏了finally 塊?或者盡管有close()但并沒有成功? 問題2:連接池大小 連接池過小會(huì)造成新的連接不上,在日志中有錯(cuò)誤信息,一般的做法是調(diào)大即可,可問題是,調(diào)的過大會(huì)造成資源無效損耗可能出現(xiàn)新的性能問題,那么調(diào)到多大較合適? 問題2解決辦法 經(jīng)驗(yàn)法則1:數(shù)據(jù)庫(kù)連接池?cái)?shù)=線程池?cái)?shù)X每個(gè)線程需要連接數(shù)據(jù)庫(kù)平均數(shù)X1.1 (1.1的含義是加10%的峰值期負(fù)載), 通常, 每個(gè)線程需要連接數(shù)據(jù)庫(kù)平均數(shù)是一個(gè),也即:當(dāng)線程池?cái)?shù)120時(shí), 數(shù)據(jù)庫(kù)連接池?cái)?shù)就是132。 經(jīng)驗(yàn)法則2:設(shè)置最初池大小=最大池大小。
SQL語句及其索引或鎖定屬性問題 問題:SQL語句及其索引或鎖定屬性不合理 可能引發(fā)DISKIO過忙(磁盤讀寫數(shù)據(jù))或者CPU過忙(在內(nèi)存中索引排序),造成執(zhí)行時(shí)間過長(zhǎng),阻塞線程的執(zhí)行,最終引發(fā)系統(tǒng)掛起。 或者執(zhí)行超時(shí)引發(fā)系統(tǒng)掛起:例如錯(cuò)誤信息 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2857) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate 或者死鎖引發(fā)系統(tǒng)掛起:例如錯(cuò)誤信息 java.sql.SQLException: ORA-00060: deadlock detected while waiting for resource at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:170) 解決辦法 優(yōu)化SQL語句及其索引或鎖定屬性。 |
|