午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

性能測(cè)試及分析調(diào)優(yōu)準(zhǔn)則

 魔方_狐貍 2018-05-30

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ò)誤或鎖定。

 

  常見性能問題成因

常見性能問題及成因列表:

性能問題

描述

問題特征

成因

線性內(nèi)存泄漏

每單位(每事務(wù)、每用戶等)泄漏造成內(nèi)存隨著時(shí)間或負(fù)載線性增長(zhǎng)。這會(huì)隨著時(shí)間或負(fù)載增長(zhǎng)降低系統(tǒng)性能。只有重啟才有可能恢復(fù)。

隨著時(shí)間越來越慢
隨著負(fù)載越來越慢

雖然可能有多種外部原因,但最典型的是與資源泄漏有關(guān)(例如,沒有清理不能被GC回收的大對(duì)象,引起大對(duì)象不斷積累)。

指數(shù)方式內(nèi)存泄漏

雙倍增長(zhǎng)的內(nèi)存泄漏造成系統(tǒng)內(nèi)存消耗表現(xiàn)為時(shí)間的指數(shù)曲線

隨著時(shí)間越來越慢
隨著負(fù)載越來越慢

通常是由于向集合(Vector,HashMap) 中加入永遠(yuǎn)不刪除的元素造成的。

糟糕的編碼:無限循環(huán)

線程在 while(true) 語句以及類似的語句里阻塞。

可以預(yù)見的鎖定

需要對(duì)循環(huán)進(jìn)行大刀闊斧的刪剪。

資源泄漏

JDBC 語句,CICS 事務(wù)網(wǎng)關(guān)連接,以及類似的東西被泄漏了,造成橋接層和后端系統(tǒng)的影響。

隨著時(shí)間越來越慢
可以預(yù)見的鎖定
突然混亂

通常情況下,這是由于遺漏了 finally 塊,或者更簡(jiǎn)單點(diǎn),就是忘記用 close() 關(guān)閉外部資源的對(duì)象所造成的。

外部瓶頸問題

后端或者其他外部系統(tǒng)(如鑒權(quán))越來越慢,同樣減緩了應(yīng)用服務(wù)器和應(yīng)用程序

持續(xù)緩慢
隨著負(fù)載越來越慢

咨詢專家(負(fù)責(zé)的第三方或者系統(tǒng)管理員),獲取解決外部瓶頸問題的方法。

外部系統(tǒng)

應(yīng)用程序通過太大或太多的請(qǐng)求濫用后端系統(tǒng)。

持續(xù)緩慢
隨著負(fù)載越來越慢

清除冗余的工作請(qǐng)求 ,批量處理相似的工作請(qǐng)求,把大的請(qǐng)求分解成若干個(gè)更小的請(qǐng)求,調(diào)整工作請(qǐng)求或后端系統(tǒng)(例如,公共查詢關(guān)鍵字的索引)等。

糟糕的編碼:CPU密集的組件

一些糟糕的代碼進(jìn)行交互處理時(shí),就掛起了 CPU,把吞吐速度減慢到爬行的速度。

持續(xù)緩慢
隨著負(fù)載越來越慢

典型的解決方案就是數(shù)據(jù)高速緩存。

中間層問題

實(shí)現(xiàn)得很糟糕的橋接層(如JDBC 驅(qū)動(dòng)程序、數(shù)據(jù)庫(kù)連接池管理),由于對(duì)數(shù)據(jù)和請(qǐng)求不斷的排列、解除排列,從而把所有通過它的流量減慢到爬行速度。這個(gè)毛病在早期階段很容易與外部瓶頸混淆。

持續(xù)緩慢
隨著負(fù)載越來越慢

檢查橋接層和外部系統(tǒng)的版本兼容性。如果有可能,評(píng)估不同的橋接供應(yīng)商。如果重新規(guī)劃架構(gòu),有可能完全不需要橋接。

內(nèi)部資源瓶頸:過度使用或分配不足

內(nèi)部資源(線程池、對(duì)象池)變得稀缺。是在正確使用的情況下加大負(fù)載時(shí)出現(xiàn)過度使用還是因?yàn)樾孤?/p>

隨著負(fù)載越來越慢
零星的掛起或異常錯(cuò)誤

分配不足:根據(jù)預(yù)期的最大負(fù)載提高池的最大尺寸。過度使用:請(qǐng)參閱外部系統(tǒng)的過度使用。

不停止的重試

這包括對(duì)失敗請(qǐng)求連續(xù)的(或者在極端情況下無休止的)重試。

可以預(yù)見的鎖定
突然混亂

可能是后端系統(tǒng)完全當(dāng)機(jī),或者網(wǎng)絡(luò)連接中斷。

線程:阻塞點(diǎn)

線程遇到同步阻塞,造成交通阻塞。

隨著負(fù)載越來越慢
零星的掛起或異常錯(cuò)誤
可以預(yù)見的鎖定
突然混亂

可能同步是不必要的(只要重新設(shè)計(jì)),或者比較外在的鎖定策略(例如,讀/寫鎖)也許會(huì)有幫助。

線程:死鎖/活動(dòng)鎖

這是基本的“獲得順序”的問題。

突然混亂

“獲得順序”的算法不合理。

 

 

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 ServerTomcat)都不是在孤立地運(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語句及其索引或鎖定屬性。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多