常見的性能缺陷
性能測試,是結合被測系統應用架構、業務場景和實作細節、邏輯,對軟體響應時間、處理速率、容錯能力等進行分析測試,找到系統的性能瓶頸,并确認問題得到解決的過程。
性能測試缺陷分類
缺陷類型 | 缺陷描述 |
硬體 | 磁盤空間 |
CPU | |
IO讀寫速率 | |
記憶體 | |
網絡 | 帶寬 |
網絡波動 | |
CDN | |
延時 | |
丢包 | |
應用 | JVM |
代碼邏輯 | |
配置 | JDK版本 |
底層配置 | |
參數配置 | |
資料庫 | 索引 |
鎖 | |
表空間 | |
慢SQL | |
資料量 | |
中間件 | 逾時 |
線程池 | |
緩存政策 | |
最大連接配接數 | |
通信實作方式 | |
負載均衡 |
一、硬體
磁盤空間:磁盤空間不足導緻系統運作變慢,檔案、日志等無法生成存放導緻的性能瓶頸;
CPU:CPU的核心功能是解釋計算機指令以及處理資料,性能主要展現在其運作程式的速度上。影響運作速度的性能名額包括工作頻率、Cache容量、指令系統和邏輯結構等參數;
IO讀寫速率:即input和output,輸入和輸出,主要考慮資料處理時的讀寫速度,頁交換等情況;
記憶體:所有的程式都是運作在記憶體中的,其作用是用于暫時存放CPU中的運算資料,以及與外部存儲器交換的資料,記憶體不足會限制程式的資料處理速度,是以這也是很重要的一項性能關注名額;
二、網絡
帶寬:高并發情況下,如果帶寬不足,可能會導緻網絡資源競争,逾時等情況;
網絡波動:這裡是從網絡的穩定性來描述,即性能測試的環境,需要一個穩定的網絡環境;
CDN:即内容分發服務,有時候不同的CDN政策也會影響到“使用者”感覺到的系統性能表現;
延時:延時的值越大,對系統性能表現影響越大(比如格鬥類的PVP遊戲),且性能測試的結果也存在更大的偏差;
丢包:資料在網絡上是以資料包的形式傳輸的,如果丢包,則可能造成報錯或異常的情況;
三、應用
1、JVM
堆記憶體配置設定:根據系統硬體條件來進行合理的堆記憶體配置設定,一般來說JVM的堆記憶體配置設定不要超過系統記憶體的25%較好;
垃圾回收算法:JAVA的動态垃圾回收機制,是基于不同的幾種回收算法來進行的,根據具體的情況,選擇合适的垃圾回收政策;
OOM:即記憶體溢出(outof memory),這個算是性能測試中很常見的一個問題,通常是由于代碼問題造成的記憶體洩漏、GC不夠徹底、記憶體被耗盡引起;
2、代碼邏輯
常見的情況有不合理的線程引用和記憶體配置設定;
四、配置
版本:在性能測試過程中,一定要確定被測系統的版本和實際生産保持一緻,否則由于版本不同帶來的些許差異可能會對性能測試帶來很大的偏差和影響;
底層配置:涉及到作業系統、伺服器等硬體的一些配置方式不合理,帶來的性能瓶頸;
參數配置:系統架構設計中,各個不同的參數配置帶來的性能瓶頸;
五、資料庫
索引:索引的存在就像一個标簽目錄一樣,在執行資料庫操作時提供更為快速的執行效率,減少磁盤IO操作和執行的資料庫系統時間;
鎖:為了保證事務的原子性和隔離性,有了鎖的存在,但有時候由于某些原因造成的表鎖,也是性能瓶頸的一種表現;
表空間:不合理的表空間設計,導緻的資料庫性能問題;
慢SQL:慢SQL會導緻資料庫操作時間變長,增加IO讀寫以及引起一些列的資源競争等問題,常見的慢SQL原因如下(以MySQL為例):
資料量:對同一張表來說,1W條資料和1000W條資料,對其進行操作時的性能表現也是不同的,是以在性能測試時對于資料的正确性可用性,以及資料量也是需要重點關注的;
六、中間件
逾時:設定合理的請求或響應逾時時間,是很有必要的,這點要根據具體的業務場景和系統架構來考慮,具體的逾時時間,建議進行配置測試來設定;
線程池:之前的部落格介紹過線程池的相關資料,線程池配置太小,很容易被使用完,太大的話又浪費資源,合理的線程池,建議進行配置測試來确定;
緩存政策:緩存的優點是減少請求響應過程中的傳輸時間,但有時候在高并發情況下,緩存很容易失效而導緻緩存穿透,瞬間對服務端帶來很大的壓力;