Performance

系統測試 Performance (1)

教學目標

初步了解針對系統進行效能測試的基本概念。

重點概念

首先目前軟體和系統越來越複雜的情況下效能測試已經成為系統測試最重要的衡量標準之一,同時效能測試需要很強的技術能力和綜合分析問題的能力。此外在進行效能測試之前,我們最好先了解相關的專有名詞,分別為:

  1. 同時在線人數:主要是針對網站應用程式伺服器或資料庫伺服器是否因為使用者操作產生影響,也就是在同一時間與伺服器進行互動操作的在線使用者人數。此外若一個系統期望使用者為 1000 人,則在 100 個以內的同時在線人數的條件下測試系統的回應時間和每秒鐘系統能夠處理的交易數理應就能滿足效能的需求。
  2. 請求回應時間:主要是針對從客戶端發出請求至得到回應的整個過程的時間,其中主要包括網路回應時間和網站應用程式與系統回應時間,請求回應時間的單位一般為秒或毫秒。
  3. 交易回應時間:主要是針對特定業務交易行為的回應時間,其主要是由一系列的請求所組成。
  4. 資料輸出量:主要是指在一次效能測試過程中網路上傳輸的資料流量總和,並且輸出量/傳輸時間=輸出率,主要是指在單位時間內網路上傳輸資料流量,也就是單位時間內能夠處理客戶端請求數,其是個衡量網路傳輸效能的重要指標,通常以位元組/秒、請求數/秒、頁面數/秒、…等指標進行衡量。當然我們也能夠從業務角度以每秒交易量,也就是指每秒鐘系統能夠處理的交易數,以利衡量系統業務處理能力的重要指標。
  5. 資源利用率:主要是針對不同系統資源的使用程度,像是伺服器的 CPU、記憶體、磁碟、…等利用率,其主要就是分析系統效能關鍵的指標,更進一步以此為依據改善效能。

接著系統效能測試有許多不同的類型,分別為:

  1. 配置設定測試:主要是透過測試找出系統各項資源的最適當的效能設定,以利評估系統正式環境參數配置設定的重要參考資訊。
  2. 負載壓力測試:主要是針對系統不斷增加負載,直到效能指標達到極限,重點在於系統在較大負載下長時間持續增加負載的情況,以利找出系統的瓶頸,以利評估系統正式環境參數優化和最大服務等級。
  3. 穩定可靠測試:主要是為了測試系統在異常情況下的處理能力,以及系統在一定壓力下長時間執行之後是否穩定可,以利評估系統是否能夠長時間穩定提供可靠的服務。
  4. 大量資料測試:主要是針對資料量進行測試,以利評估系統正式環境的資料達到不同資料量時的效能。
  5. 同時在線測試:主要是用於測試同一時間內多個使用者同時存取同一個系統、同一模組、同一業務功能和同一資料記錄時是否存效能問題,以利評估系統正式環境能夠同時服務多少個使用者操作。

再來效能測試已經不是簡單提供硬體配置就能夠提高效能,因為若軟體本身存在效能問題,則再多的資源也會不夠使用,像是記憶體外洩的問題就會隨著時間的增加,記憶體最終會被耗盡,最後將會導致系統崩潰。所以若客戶對於效能要求較高時,則提高硬體配置之外,更需、從資料庫,伺服器、作業系統和軟體進行優化。此外若是的資料庫中的資料表設計不合理,像是大量資料儲存在一個資料表中,此時將會導致當同時在線人數過多時,資料庫伺服器無法即時處理使用者請求,最後被迫停止提供系統服務。當然針對演算法問題、記憶體外洩、低效能 SQL 查詢、…等問題,皆應該修正軟體中的程式解決問題。

最後效能調整主要是為了系統進行優化,對於效能測試中發現的問題,通常是由效能資料庫管理師、系統管理員、開發人員、…等相關資訊人員共同解決,主要有五個步驟,分別為:

  1. 確認問題:主要確認系統是否存在問題,並且針對問題進行正確定義,以利找出系統瓶頸點,通常我們能夠從應用程式程式碼、資料庫設定、作業系統設定、硬體配置和網路配置這五大方面確認問題。同時更需針對使用情況進行調查,像是是否聽到使用者的抱怨、是否特定操作的回應時間隨著使用時間越來越長、是否 CPU 使用率很低而 I/O 使用率很高、…等問題。
  2. 確認原因:主要確認問題發生的根本原因,通常會需要涉及有關作業系統、資料庫、網路和程式開發等許多方面的專業知識與經驗,並且廣泛的收集記錄檔資訊,以利進行分析找出根本原因,像是問題影響是客戶端或伺服器、問題影響是回應時間或業務輸出量、問題影響是所有使用者或特定使用者、問題影響是所有模組或特定模組、問題影響是系統資源不足或硬體配置不足、…等系統相關問題,以利針對系統瓶頸有更深入的了解,更進一步分析出真正的原因。
  3. 確認調整目標和解決方案:主要確認調整目標和設計解決方案,確認目標的主要目的在於確認何時停止調整系統,避免工作將永無止盡,通常根據系統不同的特點調整目標將會有所不同,主要有提高系統輸出量、縮短回應時間和服務更多在線使用者三大方面的調整目標。
  4. 測試解決方案:主要當針對調整目標執行解決方案之後,就會針對解決方案進行測試,此時測試人員可以使用之前的操作情境進行測試,驗證系統是否解決了效能問題。建議測試解決方案儘可能在仿真的測試環境下進行測試,避免直接在正式環境進行測試,除非評估了測試的風險,並且有對應的備份還原方案。
  5. 分析調整結果:主要針對解決方案進行調整結果的分析,主要考慮系統調整是否達到或超出預期目標和系統效能是否整體改善或犧牲部分效能解決問題。最後若是達到預期的調整目標,則效能調整工作完成,否則需要重複上述的相關步驟。

相關資源

解決問題 Performance (2)

教學目標

初步了解 JVM 中垃圾回收器的基本概念以利解決應用程式效能的問題。

重點概念

首先當我們啟動 Java 網站應用程式時,將會透過 Java 虛擬機器 (Java Virtual Machine,JVM) 執行程式,並且每個 Java 網站應用程式皆會執行在獨立的 JVM 中,並且在啟動 JVM 時皆會配置 Heap 記憶體的大小,也就優化入門調整 -Xms 和 -Xmx 參數值設定 Heap 記憶體的大小,若記憶體夠大且有效能考量,則建議兩個參數設定一樣,以及每個 JVM 中同時執行多執行緒,其中有個執行緒稱為 GC 執行緒,它主要會將不必要的物件,也就是將不使用的物件進行回收,並且進行清除。

記憶體大小相關參數 說明
-Xms 主要設定啟動 JVM 時使用 Heap 記憶體的大小。
-Xmx 主要設定在 JVM 中使用 Heap 記憶體的最大值。

接著在 JVM 的垃圾回收皆採用分代回收的演算法,所謂分代回收主要是基於物件不同的生命周期採取不同的回收方式,以利提高垃圾回收的效率。其中主要分為三個世代,分別為:

  1. 新生代:一開始物件會建立於新生代中,並且生命週期很短。每次新生代的垃圾回收之後,只有少數的物件存活,就是所謂 Minor GC,主要透過複製演算法進行回收。
  2. 老年代:當物件在新生代中經歷多次垃圾回收之後仍然存活,就會被放至老年代中,並且生命週期較長。每次老年代的垃圾回收,將會花費較長的時間,就是所謂 Major GC,主要透過「標記/清理」或「標記/整理」演算法進行回收,至於所謂 Full GC 則是指新生代和老年代同時進行回收。
  3. 持久代:主要儲存中繼資料,像是類別、方法、…等資訊,與垃圾回收機制沒有直接相關。

此外我們能夠透過 jconsole 工具中的記憶體頁籤中觀察三個世代的使用情況。其中又可再分為 Heap 記憶體和非 Heap 記憶體,所謂 Heap 記憶體主要是代表新生代和老年代,而非 Heap 記憶體主要是代表持久代。

垃圾回收名稱 說明
Minor GC 主要發生在新生代中,發生頻率高和清理速度快。
Major GC 主要發生在老年代中,發生頻率低和清理速度慢。
Full GC 主要同時發生在新生代和老年代中,發生頻率低和清理速度慢。

再來新生代又會再分為三個區域分別為一個 Eden 區和二個 Survivor 區,大部份會在 Eden 區被建立,當 Eden 區滿時,還存活的物件將會被複製至兩個 Survivor 區之中。當 Survivor 區滿時,此區的存活物件若不滿足晉升條件時就會被複製至另一個 Survivor 區。同時當物件每經歷一次 Minor GC,則年齡加 1,直到達晉升年齡門檻值之後,就會使放至老年代中,因此晉升年齡門檻值的大小直接影響物件在 新生代中停留的時間,主要是透過 MaxTenuringThreshold 參數進行設定,預設值為 15。

新生代空間大小相關參數 說明
-XX:NewRatio 主要設定新生代和老年代配置記憶體的比例。
-XX:SurvivorRatio 主要設定 Eden 區和 Survivor 區配置記憶體的比例。
-XX:NewSize 主要設定新生代配置記憶體的大小。

最後在 JVM 中則有許多不同類型的垃圾回收器,將能夠適用於不同的情境,其中常見的垃圾回收器,分別為:

  1. Serial:主要是單執行緒的垃圾回收器,適用新生代和老年代。
  2. ParNew:主要是多執行緒的垃圾回收器,適用新生代和老年代。
  3. Parallel Scavenge:主要以輸出量優先的垃圾回收器,適用新生代。
  4. Concurrent Mark Sweep:主要以最短回應停頓時間為目標的垃圾回收器,適用老年代。
  5. G1:主要是將 Heap 記憶體分為多個相等大小的區域,按照每個區域進行垃圾回收,特點為平行處理、分代收集,不會導致空間碎片,並且能夠設定停頓時間的上限,適用新生代和老年代。

相關資源

解決問題 Performance (1)

教學目標

初步了解如何透過 Java 監控工具解決應用程式效能的問題。

重點概念

首先當我們在 Windows 平台中遇到 Java 效能問題時,像是記憶體外洩、效能瓶頸、連線未釋放、系統崩潰、…等,此時我們可以先透過工作管理員工具了解目前 Java 應用程式所使用 CPU、記憶體、輸入/輸出、執行時間、執行指令、…等效能資訊,同時查看 Java 應用程式透過 log4j 所產生的相關記錄檔,以利我們初步判斷問題的可能原因。

接著為了能夠找出隱藏在 Java 應用程式中的問題,則建議使用 JVM 監控工具深入查看更多詳細資訊,至於 JVM 監控工具有常見的有哪些,請參考下表。

工具 說明
jcmd 主要提供有關 Java 應用程式的相關資訊。
jhat 主要提供記憶體中的資訊,將有助於事後分析。
jmap 主要提供 JVM 記憶體使用的資訊,將有助於事後分析。
jinfo 主要提供 JVM 系統資訊,並且能夠動態設定一些系統屬性。
jstack 主要提供 Java 應用程式的堆疊資訊。
jstat 主要提供 GC 和類別加載活動的相關資訊。
jconsole 主要提供有關 JVM 活動的相關資訊。
jvisualvm 主要提供監視 JVM 的 GUI 工具,可以用於即時分析執行中的詳細資訊。

再來我們主要透過 jvisualvm 工具即時監控 Java 應用程式的相關資訊,也就是所謂 VisualVM。其主要是一款免費整合多個 JDK 命令列工具,以視覺化方式呈現的工具,當我們安裝 JDK 預設在 bin 資料夾中就有提供 VisualVM 工具。其主要透過 JMX 遠端連線即時能夠提供我們強大的分析能力,以利針對 Java 應用程式進行效能分析和調整優化,像是監控 CPU 使用情況、監控記憶體、監控垃圾回收機制、…等相關資訊。

最後針對 Java 應用程式進行效能分析主要是透過收集 Java 應用程式執行時的執行資料來幫助開發人員定位應用程式需要進行優化的部分,以利提高應用程式的執行速度或資源使用效率,主要有 CPU、記憶體和執行緒三種資源。此外 VisualVM 除了能夠針對 CPU、記憶體和執行緒進行即時線上分析的監控分析方式之外,更提供快照分析方式和轉儲分析方式的功能,以利我們進行離線的完整分析。

相關資源

SAS 效能優化 (1)

教學目標

初步了解 SAS 系統效能優化的基本概念。

重要概念

首先 SAS 程式碼提供使用者有許多選擇存取、操作、分析和處理資料與結果,然而系統效能可能會大大影響應用程式的行為,因此我們應該在應用程式開發過程的早期設計階段了解客戶的期望,以利提供更高效能的應用程式。但是往往在專案系統開始上線前導入正式資料時,將會發現應用程式處理的效率和效能需要進行改善,主要可以針對效能統計和系統效能進行改善。所謂效能統計主要是使用於處理 DATA STEP 和 PROC STEP 的總輸入和輸出的操作、記憶體和 CPU 時間測量,我們將能夠透過 SAS 系統選項獲取統計資訊,以利協助我們衡量工作的初始效能,並且確定如何改善效能。所謂系統效能主要是使用於處理 SAS 程式的總輸入和輸出的操作、記憶體和 CPU 時間測量,我們將會重新分配關鍵資源的使用,以利改善系統效能,並且選擇最適合特定情況的技術進行優化,此外我們針對效率和效能的改善的策略,分別為:

  1. 資料儲存
  2. I/O
  3. 記憶體
  4. CPU 時間
  5. 使用時間

其中 CPU 時間和使用時間主要是測量的基準,然而透過遵循準則將能夠有效提升應用程式處理的效率和效能。一般來說,透過簡單的策略將能夠改善多達 90% 的效率,但是最後的 10% 往往將會是個挑戰,此時我們則需要進行判斷,以利確保應用程式達到相對最佳的效率,同時維持時間和成本之間的平衡。

接著我們針對五大改善的策略有哪些關鍵的技術重點呢?針對資料儲存技術主要使用資料壓縮策略,以利降低儲存資料集的儲存空間,以及使用 KEEP 或 DROP 資料集選項保留需要的變數。 針對 I/O 技術主要是考慮使用大量資料集的資料壓縮,以及建立索引資料集,以利改善資料集的存取。針對記憶體技術主要使用在記憶體中執行 DATA STEP 建立雜湊物件,以利透過可用的記憶體和記憶體速度進行改善,以及使用 MEMSIZE 系統選項控制記憶體的使用情況。針對 CPU 技術主要是在 DATA STEP 中使用 IF-THEN/ELSE 或 SELECT-WHEN/OTHERWISE 指令,或者在 PROC SQL 中使用 CASE 條件表達式處理資料,以及使用 SASFILE 敘述式在多個時間處理相同的資料,以利降低 CPU 時間和使用時間。

再來我們若要優化系統效能除了針對資料儲存透過資料壓縮的 COMPRESS 系統選項降低儲存資料集的儲存空間,並且透過 Cleanwork 工具搭配工作排程器定期清理 SAS WORK 暫存資料夾改善效能之外。我們更能夠針對 I/O 、記憶體和 CPU 效能透過系統選項的設定進行優化。

最後我們可以使用 Windows 內建的效能監控工具進行 SAS 程式處理資料時的效能監控,我們僅需要在執行對話框中輸入「perfmon」就能夠開啟效能監控工具。此時效能監控工具將會立即收集並且顯示有關所選計數器的資訊,並且我們能夠監控多個 SAS 程式相關的計數器,主要包括八個與 SAS 程式相關的計數器,分別為:

  1. Virtual Alloc’ed Memory:虛擬記憶體總配置量。
  2. Disk ReadFile Bytes Read Total:讀取硬碟檔案的總位元數。
  3. Disk ReadFile Bytes Read/Sec:每秒讀取硬碟檔案的位元數。
  4. Disk WriteFile Bytes Written Total:寫入硬碟檔案的總位元數。
  5. Disk WriteFile Bytes Written/Sec:每秒寫入硬碟檔案的位元數。
  6. Disk SetFilePointer/Sec:成功使用硬碟檔案的次數。
  7. Memlib/Memcache Current Usage K:以位元組為單位指定目前正在使用擴展記憶體數量。
  8. Memlib/Memcache Peak Usage K:以位元組為單位指定目前最大使用擴展記憶體數量。

其中每個受監控的實體皆是獨立的 SAS 程序,同時以 PID 編號的方式進行識別,當然我們也能夠透過工作管理員處理所有程序的列表。此外我們還能夠在 Process 計數器中 %Processor Time、%User Time、%Privileged Time、…等 CPU 處理相關測量參數進行報表設定。

總結 SAS 系統效能優化我們能夠從資料儲存、I/O、記憶體、 CPU 時間和使用時間五大策略開始規劃進行 SAS 系統效能優化的改善,同時使用 Windows 內建的效能監控工具進行 SAS 程式處理資料時的系統效能監控,以利找出瓶頸點持續進行效率與效能的改善。

相關資源