一、性能測試整體認知
1.性能測試技能樹:
開發語言
操作系統
數據庫
測試工具
網絡知識
業務知識
性能測試的目的:
發現性能瓶頸
2.性能測試的分類
性能測試是一個非常廣泛的概念,包括的很多方面的測試,也可稱之為非功能測試。
自動化測試屬於功能測試的范圍,由於其測試方法要求測試人員擁有一定的代碼能力,座椅被單獨分成為一個測試模塊。
-
負載測試:通過逐步加壓的方法,達到既定的性能閾值的目標。閾值的設定應是小於等於某個值,如 CPU 使用率小於等於80%。
-
壓力測試:通過逐步加壓的方法,使得系統的某些資源達到飽和,甚至失效的狀態,簡單粗暴的解釋就是什么條件下能把系統壓崩潰。
-
並發測試:在同一時間內,多個虛擬用戶同事訪問同一模塊、同一功能,通常的測試方法是設置集合點。
-
容量測試:通常是指數據庫層面的,目標是獲取數據庫的最佳容量的能力。又稱為容量預估,具體測試方法為在一定的並發用戶,不同的基礎數據量下,觀察數據庫的處理能力,即獲取數據庫的各項性能指標。
-
可靠性測試:有稱為穩定性測試或疲勞測試。是指系統在高壓情況下,長時間的運行系統是否穩定。如 CPU 使用率在80%以上,7*24小時運行,系統是否穩定。
-
異常測試:又稱為失敗測試。是指系統架構方面的測試。如在負載均衡架構中,要測試宕機、節點掛掉等情況系統的反應。
3.性能測試的工作流程
需求分析 - 性能指標制定 - 腳本開發 - 場景設置 - 監控部署 - 測試執行(並發-壓力)- 性能分析 - 性能調優 - 測試執行(並發-壓力)- 性能調優 - ... - 測試報告
4.常見系統應用分層架構
MVC架構,分塊測試能最大程度最優滴發現性能瓶頸。自低向上測試
- 顯示層(view):Web、Android、IOS、H5
- 邏輯控制層(controller):Api
- 數據存儲層(model):MySQL、MongoDB、Redis...
5.性能測試指標定義
- 事務:從客戶端發起的一個或多個請求(這些請求組成一個完整的操作),到客戶端接收到從服務器返回的響應,是一個閉環操作的過程。
- **TPS(Transaction Per Second) **:每秒鍾系統能夠處理的事務數
- 請求響應時間:從客戶端發起的一個請求開始,到客戶端接收到從服務器返回的響應。整個過程所耗費的時間。
- 事務響應時間:事務可能是由一個或多個請求組成的,事務響應時間主要是針對於用戶的角度而言,如轉賬(中國銀行發起-招商銀行接受-招商銀行反饋收到-中國銀行減去轉賬數)
- 並發:沒有嚴格意義上的並發。並發總有先后,無論差距是1毫秒或者是1微妙,總有一個時間差。所以並發將的是一個時間范圍內,比如1秒內。(如:雙十一秒殺同一商品;雙十一秒殺不同商品秒殺)
- 並發用戶數:同一單位時間內對系統發起請求的用戶數量。
- 吞吐量:一次性能測試過程中網絡上傳輸的數據量的總和。
- 吞吐率:吞吐率=吞吐量/傳輸時間,單位時間內網絡上傳輸的數據量。
- 點擊率:每秒鍾用戶向服務器提交的請求數。這個指標是 web 應用程序特有的一個指標,可以想象為每秒鍾用戶總共在頁面上進行多少次點擊動作,但是需要注意的是一次鼠標單擊的操作后,客戶端有可能向服務器發送了多少次請求。
- 資源使用率:對不同的系統資源的使用情況,如 CPU、內存、IO 等
6.性能測試的需求分析
-
分析的目的:
明確測試指標 明確測試場景
-
新系統:
同行業比較 業務預期
-
老系統:
對比以往 用戶使用行為及用戶量
7.性能測試工具
常用工具:
LoadRunner
JMeter
二、JMeter深入了解
1.JMeter安裝
1.1 Windows環境安裝
1.【[JMeter下載地址](http://jmeter.apache.org/download_jmeter.cgi)】
2. 配置環境環境變量:
電腦桌面 -—> “計算機”圖標 -—> 鼠標右鍵選擇“屬性” -—> 點擊高級系統設置 -—> 高級 -—> 環境變量 -—> 系統變量
創建JMETER_HOME="JMeter的安裝路徑"
新建或編輯CLASSPATH=";%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;"
3. 在安裝目錄bin目錄,點擊 JMeter.bat 啟動 JMeter 工具。
1.2 Linux環境安裝
2.初始JMeter
JMeter的組成:
測試計划
線程組:(1)斷言、定時器、監聽器、配置元件、后置處理器
(2)邏輯控制器
(3)Sampler
JMeter實現多並發
線程組:負載發生器,用多線程或多進程的方式來模擬用戶的使用行為。JMeter是已線程的方式來進行模擬用戶的並發訪問的。
3.JMeter實現多並發
4.JMeter實現邏輯分支控制
邏輯控制器:用來控制測試腳本的邏輯判斷,也可以理解為如何控制腳本的運行。例如:如果控制器,就是當滿足什么樣的條件后執行哪一步操作。
5.JMeter實現配置管理
配置元件:用來提供一些配置相關的信息,如 Http 請求頭、cookie 管理,提供參數化數據。還可以進行用戶自定義變量等配置,用來定義常量等。
三、Linux服務器監控性能測試
1.性能測試范圍
-
測試目的:發現服務器的性能瓶頸。配置的不同能夠承載的最大任務樹不同,能夠承載的壓力也不同。
-
測試范圍及性能指標:
CPU:車間工人 內存:臨時存儲貨物的倉庫 磁盤:倉庫 網絡:倉庫外的道路 版本:倉庫的智能化程度
2.測試與生產的環境配置不同?
多次壓測后的性能預估
3.進程與線程
進程:具有一定獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。
線程:是進程的一個實體,是CPU調度和分牌的基本單位。他是比進程更小的獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中比不可少的資源。一個線程可以創建和撤銷另一個線程。
區別:
一個線程只能屬於一個進程,而一個進程可以擁有多個線程。線程是進程工作的最小單位。
一個進程會分配一個地址空間,進程與進程之間不共享地址空間,即不共享內存。
同一進程下的不同的多個線程,共享父進程的地址空間。
線程在執行過程中,需要協作同步,不同進程的線程間要利用消息通信的辦法實現同步。
線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。
優缺點:
進程優點:
每個進程相互獨立,不影響主程序的穩定性,子進程奔潰不影響其他進程。
通過增加CPU,就可以擴大性能。
可以盡量減少線程加鎖與解鎖的影響,極大的提高了性能。
進程缺點:
邏輯控制復雜,需要和主程序交互。
多進程調度開銷大。
線程優點:
程序邏輯和控制方式簡單。
所有線程可以直接共享內存和變量等。
線程方式消耗的總資源比進程方式少。
線程缺點:
每個線程與主程序共用地址空間,最大內存地址受限。
線程之間的同步和加鎖不易控制。
一個線程的崩潰可能影響到整個程序的穩定性。
4. 服務器實時內存監控
# Linux幫助命令,可以查看所有命令的使用方法
man
# 實時監控命令
top
# 實時監控系統的運行狀態,並按CPU及內存等進行排序。
# -h 幫助
# -p 監控指定的進程。監控多個監控室,進程ID已逗號分隔。
# top任務區命令
# M 按內存使用率排序
# P 按CPU使用率排序
# z 彩色/黑白顯示
# load average -- 系統的運行隊列的平均利用率,也可認為是可運行進程的平均數(表示在最后1分鍾、5分鍾、15分鍾的平均負載值)。
# 【備注:在單核CPU中load average的值為1時表示滿負荷狀態。同理在多核CPU中滿負荷的load average的值為1*CPU核數】
top -hv | -bcHiOSs -d secs -n max -u | U user -p pid(s) -o field -w [cols]
# 內存監控
vmstat
# 可以監控操作系統的進程狀態、內存、虛擬內存、磁盤IO、CPU的信息。
# -S 使用指定單位顯示
vmstat [-a][-n][-S unit][delay[count]]
free
# 能夠監控系統的內存使用狀態
# 參數解釋:
# total 總計屋里內存的大小
# Used 已使用的內存大小
# shared 多個進程共享的內存總額
# buffers/cached 磁盤緩存的大小
5.實時監控-CPU
# 可以查看多核心CPU中每個計算核心的統計數據
mpstat
mpstat [-P{|ALL}[internal [count]]]
# 參數解釋:
# -P {|ALL}監控那個CPU,CPU的取值【0,CPU個數-1】
# internal 相鄰的兩次采樣的間隔時間
# count 采樣的次數,count只能和delay一起使用
# 使用注意:
# 當沒有參數時,顯示系統啟動以后所有信息的平均值
# 當有internal時,第一行的信息自系統啟動以來的平均是,從第二行開始輸出為前一個internal時間段的平均信息。
6.實時監控-網絡
# 用於顯示本機網絡鏈接、運行端口、路由表等信息
netstat
# 參數解釋:
# -n 拒絕顯示別名,能顯示數字的全部轉換為數字
# -l 僅列出有在 Listen(監聽)的服務狀態
# -p 顯示建立相關鏈接的程序名
# -t 顯示TCP相關選項
# -u 顯示udp相關選項
# -i 顯示自動匹配接口的信息
# -c 每隔一個固定時間,執行該 netstat 命令
6.實時監控-磁盤監控
# 是對系統磁盤IO操作進行監控的,它的輸出主要顯示磁盤的讀寫操作的統計信息,同時給出CPU的使用情況。
iostat
# 參數說明
# -x 輸出指定要統計的磁盤設備名稱,默認為所有磁盤的設備。
iostat -x sda 1
7.萬能命令-sar
sar -- (System Activity Reporter 系統活動情況報告)是目前Linux上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告
(1)文件的讀寫情況
(2)系統的調用的使用情況
(3)磁盤I/O
(4)CPU效率
(5)內存使用狀況
(6)進程活動及IPC有關的活動
# 參數說明
# n 和 t 組合定義為次數和采樣間隔
# -o file將命令結果以二進制形式放在file中
# options為命令行參數
# -A 所有報告的總和
# -u CPU利用率
# -v 進程、節點、文件和鎖表狀態
# -r 顯示系統內存的使用情況
# -B 內存分頁情況
# -b 緩沖區使用情況
#
sar [options][-A][-o file] t [n]
7.進程追蹤命令-strace
# 是一個集診、調式、統計與一體的工具,用strace對應用的系統調式和信號傳遞的跟蹤結果來對應用進行分析,以達到解決問題或是了解應用工作過程的目的。
# 參數說明
# -p 跟蹤指定的程序
# -f 跟蹤由fork子進程系統調用
# -c 統計每一系統調用的所執行的時間,次數和出錯的次數
# -t 在輸出中的每一行前加上時間信息,-tt時間確定到微秒級。
# -e 輸出過濾器,通過表達式,過濾掉不想要的輸出
# -o filename 默認將strace的結果輸出到stdout,通過-o可以將輸出寫入到filename文件中
8.Linux監控工具-nmon
nmon是一種在Linux操作系統中廣泛使用的監控與分析工具,nmon所記錄的信息是比較全面的,能夠在系統運行過程中實時地捕捉系統資源的使用情況,並且輸出結果到文件中,然后通過nmon_analyzer工具產生數據文件與圖形化結果。
nmon
# 參數說明:
-f 必選參數,並且必須放在第一個,就是輸出文件;輸出的默認文件名是hostname_date_time.nmon
-F <filename> 和-f一樣,自定義文件名稱
-s 采集保存數據的頻率
-c 采集數據次數
-t 輸出最消耗資源的進程數據
-h 查看幫助
nmon_analyser: nmon analyser的作用就是分析nmon數據采集后的結果,nmon analyser需要接祖Excel的宏。WPS默認沒有安裝宏,需要下載插件
9.Linux下的定時任務
crontab
crontab的啟動
crontab的服務權限
crontab -e編輯定時任務的列表
四、數據驅動性能測試
數據驅動:從數據文件中讀取測試數據,驅動測試過程的一種測試方法,是一種更高級的參數化。
- 特點:測試數據與測試代碼分離,數據控制過程
- 優點:減少測試代碼量;降低腳本開發和維護的成本;便於用例的修改和維護(不用修改代碼)
- *要求:較強的代碼能力;較強的分層架構設計思維;對開發框架有一定的了解
1.數據驅動的使用場景
(1)復雜的業務流程
(2)根據業務場景分流
(3)符合條件的並發場景
JMeter中的數據驅動
- 控制方式:
- 參數化(推薦使用數據庫)
- 邏輯控制器(如,if控制器)
JMeter數據驅動實戰
- 場景
- 登錄后男人瀏覽電子商品
- 登錄后女人瀏覽衣服商品
id | name | sex | age |
---|---|---|---|
1 | zhangsan | 0 | 20 |
2 | lili | 0 | 23 |
3 | wangwu | 1 | 22 |
4 | malu | 1 | 23 |
五、數據庫架構設計及性能調優
1.數據庫性能測試的目的及范圍
- 目的:發現數據庫相關的所有性能瓶頸
- 范圍:
- SQL語句 - 慢查詢等
- 資源使用率
- 數據庫架構的合理性
- 數據庫性能指標
2.數據庫的常用架構
- 一主多從:減少單台服務器的壓力,但有可能會存在主從延時的問題,其原理是:
- master將改變記錄到二進制日志(binary log)中
- slave將master的binary log events拷貝到它的中繼日志(relay log)
- salve重做中繼日志中的事件,將改變反映它自己的數據
- 雙機熱備
3.數據庫分庫分表的設計方法
- 1.拆分原因:
- 單表或庫數據量太大
- 硬件不能升級或無法升級
- 2.分庫分表方案:
- 業務拆分:用戶、商品、訂單
- 垂直拆分:商品 -> 電子商品、母嬰商品、床上商品
- 水平拆分(一致性哈希算法):同一張表拆成三張一樣規則的表
4.MySQL數據庫監控指標
拓展:MariaDB:MySQL支付創建,目標替換現有的MySQL,兼容MySQL是開源的。
- QPS:(queries per seconds 每秒查詢數量 )
- 獲取方法:mysql> show global status like 'Quesion%' ;
- 計算方法:Queries /seconds
- TPS(Transaction per seconds)
- 計算方法:TPS = (Com_commit + Com_rollback) / seconds
- 獲取Com_commit:mysql> show global status like 'Com_commit';
- 獲取Com_rollback:mysql> show global status like 'Com_rollback';
- 線程連接數
- 獲取最大使用的連接數:mysql> show global status like 'Max_used_connections';
- 獲取線程數:mysql> show global status like "Threads%"
- 最大連接數
- 獲取最大的連接數:mysql> show variables status like 'max_connections';
- Query Cache
- 查詢緩存用於緩存select查詢結果,當下次收到相同查詢請求時,不在執行知己查詢處理而直接返回結果;適用於大量查詢、很少改變表中數據
- 開啟Query Cache方法:修改my.cnf文件,將query_cache_size設置為具體大小,具體大小是多少取決於查詢的實際情況,最好設置為1024的倍數(參考值為32M);增加一行:query_cache_type=0/1/2(1:緩存所有結果;2:指定緩存)
- Query Cache命中率
- 獲取:mysql> show status like "Qcache%";
- 計算:Query_cache_hits = (Query_hits / (Qcache_hits + Qcache_inserts)) * 100%;
- 鎖定狀態:
- 獲取:mysql> show global status like '%lock%';
- 計算:Table_locks_waited / Table_locks_immediate 值越大代表表鎖造成的阻塞越嚴重
- Innodb_row_lock_waits innodb行鎖,太大可能是間隙鎖造成的
- 主從延時:
- 查詢:show salve status;
5.MySQL慢查詢工作原理及操作
- 慢查詢:執行速度超過定義的時間的查詢;不同的系統定義不同的慢查詢
- 慢查詢開啟:
- 編輯/etc/my.cnf,在[mysqld]域中添加
slow_query_log = 1
- 慢查詢日志路徑:
slow_query_log_file=/data/mysql/slow.log
- 慢查詢的時長:
long_query_time = 1
- 未使用索引的查詢也被記錄到慢查詢日志中
log_queries_not_using_indexes = 1
- 編輯/etc/my.cnf,在[mysqld]域中添加
- 慢查詢日志分析:
mysqldumpslow # 參數說明: # -s 表示按何種方式排序 # c:訪問計數 # l:鎖定時間 # r:返回記錄 # t:查詢時間 # al:平均鎖定時間 # ar:平均返回記錄數 # at:平均查詢時間 # -t 返回前面多少條的數據 # -g 后面寫一個正則匹配模式,大小寫不敏感
- 返回記錄集最多的10個SQL
mysqldumpslow -s r -t 10 slow.log
- 返回訪問次數最多的10個SQL
mysqldumpslow -s c -t 10 slow.log
- 返回按照時間排序的前10條里面包含左連接的SQL
mysqldumpslow -s t-t 10 -g "left join" slow.log
- 返回記錄集最多的10個SQL
6.SQL的分析與調優方法
explain(執行計划)
- 用法:explain select 語句
- 結果分析:
- id:select識別符,代表語句的執行順序,一般在select嵌套查詢時會不同;數字越大越先執行;null代表是結果集
- select_type:
- simple:不需要union操作或者不包含子查詢的簡單select查詢,有連接查詢時,外層的查詢為simple且只有一個
- primary:一個需要union操作或者含有子查詢的select,位於最外層的單位查詢的select_type紀委primary且只有一個
- union:連接的兩個select查詢,第一個查詢時dervied派生表,除了第一個表外,第二個以后的表select_type都是union
- dependent union:與union一樣,出現在union或union all語句中,但是這個查詢要收到外部查詢的影響。
- union result:包含union的結果集,在union和unionall語句中,因為它不需要參與查詢,所以id字段為null
- subquery:除了from字句中包含的子查詢外,其他地方出現的子查詢都可能是subquery
- dependent subquery:dependent union類似,表示這個subquery的查詢要收到外部查詢表查詢的影響
- derived:from字句中出現的子查詢,也叫派生表,其他數據庫中可能叫做內聯視圖或嵌套select
- table
- 顯示的查詢表名,如果用別名就顯示別名;
- 為null表示不涉及對數據表的操作;
- 顯示
表示為這個是臨時表
- type
- 依次好到差
system 、const 、eq_ref、ref、fulltext、ref_or_null、unique_subquery、index_subquery、range、 index_merge、index、ALL
- 除了ALL,其他的type都可以用到索引,掃描全表數據文件
- 除了index_merge外,其他只能用一個索引,常見於and或or使用了不同的索引
- system:表中只有一行或是空表,且只能用myisam和memory表
- 如果是Innodb引擎表,type列在這個情況通常都是ALL或index
- const:使用唯一索引或主鍵返回記錄一定是1行記錄的等值where條件時,通常type是const
- eq_ref:出現在要連接過這個表的查詢計划中,驅動表只返回 一行數據,且這行數據時第二表的主鍵或者唯一索引
- ref:返回數據不唯一的等值查找就肯能出現
- fulltext:全文檢索,優先級很高
- ref_or_null:與ref類似,只增加了null值的比較
- unique_subquery:用於where中in形式子查詢,子查詢返回不重復唯一
- index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表。
- range:索引范圍掃描,常用於>,<,is null,bettwen等
- index:索引全表掃描,把索引從頭到尾掃描一遍
- 依次好到差
- possible_keys:查詢可能使用到的索引都會在這里列出來
- key:查詢真正使用到的索引,select_type為index_merge時,這里可能出現兩個以上的索引,其他的select_type這里只會出現一個
- key_len:用於處理查詢的索引長度;單列索引全算,多列不一定全算
- ref:若果是常數等值查詢,顯示const;如果使用了表達式或函數,顯示func
- rows:執行計划中估算的掃描行數,不是精確值
- Extra:
- distinct:select中使用了distinct
- no table used:不帶from字句的查詢或者From dual查詢
- using filesort:排序時無法使用到索引;常見於order by或group by語句中
- using index:查詢時不需要回表查詢,直接通過索引查詢的數據
- using intersect:使用and的各個索引的條件,表示是從處理結果去交集
- using union:使用了or的各個索引的條件,表示是從處理結果取並集
- using where:使用了where條件,表示存儲引擎返回的記錄不是所有的都滿足查詢條件,需要在server層進行過濾
7.MySQL索引概念及規范
-
索引類型
- 主鍵索引:特殊的唯一索引,不允許有空值(id列),創建表時確定創建
- 唯一索引 :索引列的值必須唯一,不允許空值
- 普通索引 :最基本的索引,沒有任何限制
- 全文索引 :fulltext只適用於MyISAM表的一個索引類型(char、varchar、text)
match()實現全文索引 - 組合索引 :多列索引,是得多列上創建索引,最左前綴規則(id,name,age-->id、name、age,id、name,id)
-
索引創建規范
可以提高傳下效率,但也會降低插入和更新的速度並占用磁盤空間,在插入和更新數據時,要重寫索引文件- 單張表中索引數量不超過5個
- 單個索引中的字段數不超過5個
- 不適用更新頻繁的列作為主鍵
- 合理創建組合索引(避免冗余)
- 不在低基數列上建立索引,如性別
- 不在索引列進行數學運算和函數運算,會是索引失效
- 不適用%前導的查詢,如like "%xxx"無法使用索引
- 不適用反向查詢,如not in、not like
- 選擇越小的數據類型越好占用空間少,處理更快
- 在經常需要排序(order by)、分組(group by)、和distinct列上用不了索引,索引考慮加where或加limit
- 在表與表的連接條件上加索引,可以加快連接查詢的速度
- 使用短索引,字段本來短
8.MySQL的存儲引擎
- MyISAM:
- 優點:
- 讀的性能比Innodb高很多
- 索引與數據分開,使用了壓縮,提高了內存使用率
- 缺點:
- 不支持事務
- 寫入數據時,直接鎖表
- 優點:
- InnoDB:
- 優點:
- 支持事務
- 支持外鍵
- 支持行級鎖
- 缺點:
- 不支持fulltext索引(全文索引)
- 行級鎖並不絕對,當不確定掃描范圍時,鎖全表
- 索引與數據時緊密捆綁的,沒使用壓縮導致體積龐大
- 優點:
10.MySQL實時監控
orzdba 淘寶團隊開發的
11.MySQL集群監控工具
天兔LEPUS
【下載】
簡介:
12.MySQL性能測試的用例准備
13.JMeter開發MySQL性能測試腳本
14.執行測試
七、多協議接口性能測試
-
目標:
- 發現應用接口程序的性能瓶頸
- 發現數據庫的性能瓶頸
-
范圍:
- 應用程序各項性能指標
- 數據庫各項性能指標
1.常見接口協議:
-
HTTP協議:超文本傳輸協議
-
HTTPS協議:安全超文本傳輸協議
- 默認端口:443
- 安全性的SSL加密傳輸協議(網站證書),可以理解為HTTP協議的安全版
- 協議棧中的位置
- HTTPS
- SSL/TLS
- TCP/IP
- 數據鏈路層
-
FTP協議:文件傳輸協議
- 默認端口:21和20
- 21:用戶表示、口令、發送的命令
- 20:數據連接用於實際傳輸一個文件(主動模式)
- HTTP和HTTPS面向網頁的,FTP面向文件的
- FTP使用兩個並行TCP連接來進行文件傳輸
- FTP使用兩個並行TCP連接為控制連接和數據連接
- 默認端口:21和20
-
TCP/IP協議:中間層協議,網絡控制協議/互聯網協議
-
UDP協議:用戶數據協議
2. JMeter進行FTP協議接口測試
Linux搭建FTP服務器
3.性能測試用例設計及測試報告
-
性能測試用例設計:
- 被測系統及版本
- 測試數據
- 測試場景(包含異常場景)
- 預期結果
- 預期性能指標
-
性能測試測試報告:
- 被測系統
- 版本號
- 運行環境、配置
- 測試場景(並發定義)
- 預期性能指標
- 實際結果
- 測試結論
- 測試人員
- 如不通過說明瓶頸
- 如通過說明最大性能指標
- 容量規划