1. 程式人生 > >《質量全面管理—從項目管理到容災測試》_性能測試部分

《質量全面管理—從項目管理到容災測試》_性能測試部分

緩沖區 啟動 調優 狀況 定性 並發數 保留 磁盤 處理

  僅作記錄,以備後續方便翻閱。

一、性能測試方法歸納

測試方法

測試方法簡述

測試目的和關註點

負載測試

通過模擬系統所承載的並發用戶或請求流量的負荷,用不斷加壓的方式觀察系統在不同壓力下的性能變化,在滿足性能指標的情況下,系統所能承受的最大負載量。

通過不同負載測試得出響應性能指標:

1.得出系統最優tps;

2.得出系統最優tps時硬件資源利用率;

3.得出系統最優並發數。

壓力測試

指判斷被測系統在強壓力下何時出現不可恢復的崩潰現象,如宕機、僵死、異常現象等。

著重於系統在強壓力下的性能狀況:

1.得出系統崩潰點的tps;

2.得出系統崩潰點的tps硬件資源利用率;

3.得出系統極限並發數。

容量測試

為了確定系統可處理同時在線的最大用戶數,使系統承受超額的數據容量來發現它是否能夠正確處理。

1.獲取系統在拐點時的性能數據;

2.獲取系統性能點下降時的性能數據容量測試在資源占用和其他應用方面都有設定的指標,如CPU、內存、磁盤使用量、平均負載等,這些指標的設定一般采用8/2原則,即CPU使用量不超過80%等。

穩定性測試

指給定的負載下,系統長時間健康運行不出現故障、不出現異常的峰值。

1、給定的負載一般是以容量極限為參考,用8/2原則制定負載模式。但在實際的穩定性測試中,一般使用恒定的負載進行測試。

2、測試執行時間一般按24小時×7天,但這只是個參考值,而不是個標準值。具體時間看系統看需求,幾小時到幾天不等。

1.長時間測試中系統不宕機;

2.被測業務場景無性能問題;

3.某業務出現錯誤時,系統可穩定持續運行。關註系統穩定性,要對資源、連接池、JVM年老區變化、tps、應用系統響應時間和DB健康狀況進行關註。

二、監控分析

1、一些小工具

Nmon:監控服務器的硬件資源,如cpu、Memory、Disk和網絡等。

Visual VM:監控DB的連接數、JVM堆內存使用情況和線程情況。

Toad和Oracle EM企業管理器:獲取Oracle數據庫的AWR報告,監控數據庫cpu、負載、索引、Top X使用頻率的SQL語句、Top X的會話等。

MySQL可以分析Performance_schema性能檢測庫和MySQL的慢日誌(slow log)。

2、執行性能測試時監控和分析的過程(參考):

a)使用性能測試工具收集應用系統的業務性能數據,並監控數據有無性能異常;

b)觀察服務器的硬件資源和性能狀況,判斷硬件是否存在瓶頸,監控數據包括cpu、Memory、Disk、I/O、網絡和數據庫連接數等;

c)了解JVM,分析JVM參數是否存在問題,監控JVM使用情況是否有異常;

d)4深入分析問題根源,如分析JVM、查詢代碼異常、使用Oracle分析工具分析數據庫問題,結合第1步的業務性能,最後確定瓶頸所在的位置;

e)找出可優化的參數和硬件資源,調整之後進行調優測試;

f)調優後,對先前的性能問題進行回歸測試,監控性能數據,驗證性能問題是否已經解決。

三、JVM基礎

1)運行時的數據區:

  JVM內存中的堆只有一個,被所有線程共享,用來存儲對象本身以及數組,而數組引用是存放在Java棧中的。Java的垃圾回收機制會自動處理空間釋放的問題,因此這部分空間也是Java垃圾收集器(Garbage Collector)需要進行內存管理的主要區域。

  方法區也是被線程共享的區域,存儲了每個類的信息,包括類的名稱、方法、字段、靜態變量、常量以及編譯器編譯後的代碼等。

技術分享圖片

四、JVM垃圾回收

  JVM根據Generation(代)進行垃圾收集,分為New Generation(新生代)、Tenured Generation(年老代)、Permanent Generation(持久代),其中新生代包括一個Eden、兩個Survivor區。“持久代”就是方法區,新生代和年老代都在堆空間內。

——JVM的垃圾收集器主要包含三種回收方式:

1、Minor GC

  指從新生代(包括Eden和Survivor區域)回收內存的過程。Survivor區分為S1區和S2區,一般會保持一個區是空的。新建的對象都會放置在Eden區中,當Eden區已滿、無法分配空間給新建對象時,就會發生Minor GC。此時會將存放在Eden區中的存活對象復制到原先為空的S1區,而Eden區基本上會被清空。另一個S2區的存活對象會被復制到年老代,S2會清空。Minor GC發生後,Eden區和其中一個Survivor區被清空,而另一個Survivor區保留著短期的存活對象。

2、Major GC

  指從年老代回收內存的過程。Major GC大都是由Minor GC觸發的。如果Survivor區全滿,裝不下更多來自Eden區或者另一個Survivor區的對象時,就會將有一定年齡的存活對象復制至年老代。當年老代放置不下對象時,就會觸發Major GC。Major GC的執行代價比Minor GC要昂貴很多,速度比Minor GC要慢至少10倍以上。

3、Full GC

  指清理整個堆空間的過程,包括新生代和老年代。當垃圾回收出現異常時,會記錄GC的執行頻率和回收內存的日誌,並以此為依據判斷JVM是否有性能問題,以及調整JVM參數和減少GC頻率等。

——JVM出現的最常見問題有內存泄露和內存溢出:

1、內存泄露(Memory Leak)

指程序在運行過程中動態申請的內存空間不再使用後沒有及時得到釋放,從而導致內存無限增長。這可能是算法問題或新建對象過多沒有釋放。

2、內存溢出(Out Of Memory,OOM)

指用戶在對其數據緩沖區操作時,超過了其緩沖區的邊界,尤其是對緩沖區寫操作時,緩沖區的溢出很可能導致程序的異常,也就是分配的內存不足以放下數據項。

內存泄露的堆積,會耗盡所有內存,最後導致內存溢出。

技術分享圖片

——導致OutOfMemoryError異常的常見原因有以下幾種,參考:

1)JVM啟動參數的內存值設定過小,造成堆溢出;

2)一次性加載數據量過大,比如生命對象分配的空間過大;

3)集合類引用對象後,未能及時清空,使得JVM內存不能回收;

4)代碼中存在死循環或者產生過多重復的對象實體;

5)線程池過小,不能再新建更多的原生線程(Native Thread);

6)交換空間小。(Survivor區)

《質量全面管理—從項目管理到容災測試》_性能測試部分