性能測試是什么?
- 性能測試:指通過自動化的測試工具模擬多種正常麦箍、峰值以及異常負(fù)載條件來對系統(tǒng)的各項性能指標(biāo)進(jìn)行測試。
性能要求
- 用戶
- 響應(yīng)速度
- 穩(wěn)定性
- 開發(fā)
- 架構(gòu)是否合理
- 數(shù)據(jù)庫設(shè)計
- 代碼
- 系統(tǒng)管理員
- 資源利用率(合適的比例)
- 可擴展性
- 系統(tǒng)容量(可容納的用戶請求)
- 穩(wěn)定性
性能測試應(yīng)用場景
- 能力驗證 關(guān)注在給定的軟硬件條件下陶珠,系統(tǒng)能否具有預(yù)期的能力表現(xiàn)
- 規(guī)劃能力 關(guān)注如何使系統(tǒng)具有我們要求的性能能力
- 性能調(diào)優(yōu) 主要用于對系統(tǒng)性能進(jìn)行調(diào)優(yōu)
- 缺陷發(fā)現(xiàn) 發(fā)現(xiàn)缺陷或問題重現(xiàn)挟裂、定位手段
- 性能基準(zhǔn)比較 比較每次迭代中的性能表現(xiàn)變化,判斷迭代是否達(dá)到了目標(biāo)
性能測試類型
- 基準(zhǔn)測試:在給系統(tǒng)施加較低壓力時揍诽,查看系統(tǒng)的運行狀況并記錄相關(guān)數(shù)做為基礎(chǔ)參考诀蓉。
- 并發(fā)測試:測試多個用戶同時訪問同一個應(yīng)用、同一個模塊或者數(shù)據(jù)記錄時是否存在死鎖或者其他性能問題暑脆。
- 負(fù)載測試:是指對系統(tǒng)不斷地增加壓力或增加一定壓力下的持續(xù)時間渠啤,直到系統(tǒng)的某項或多項性能指標(biāo)達(dá)到安全臨界值,例如某種資源已經(jīng)達(dá)到飽和狀態(tài)等添吗。
- 壓力測試:壓力測試是評估系統(tǒng)處于或超過預(yù)期負(fù)載時系統(tǒng)的運行情況沥曹,關(guān)注點在于系統(tǒng)在峰值負(fù)載或超出最大載荷情況下的處理能力。
- 穩(wěn)定性測試:在給系統(tǒng)加載一定業(yè)務(wù)壓力的情況下碟联,使系統(tǒng)運行一段時間妓美,以此檢測系統(tǒng)是否穩(wěn)定。
性能測試基本概念
-
并發(fā)數(shù)
- 并發(fā)用戶數(shù):某一物理時刻同時向系統(tǒng)提交請求的用戶數(shù)鲤孵,提交的請求可能是同一個場景或功能壶栋,也可以是不同場景或功能。
- 在線用戶數(shù):某段時間內(nèi)訪問系統(tǒng)的用戶數(shù)普监,這些用戶并不一定同時向系統(tǒng)提交請求
- 系統(tǒng)用戶數(shù):系統(tǒng)注冊的總用戶數(shù)據(jù)
- 吞吐量(TPS) : 單位時間內(nèi)系統(tǒng)處理的客戶端請求的數(shù)量(完成一個業(yè)務(wù)事務(wù)的過程)
- 響應(yīng)時間 :從用戶發(fā)送一個請求到用戶接收到服務(wù)器返回的響應(yīng)數(shù)據(jù)這段時間就是響應(yīng)時間
-
資源利用率 :指的是對不同系統(tǒng)資源的使用程度贵试,通常以占用最大值的百分比來衡量
- CPU:就像人的大腦丧没,主要負(fù)責(zé)相關(guān)事情的判斷以及實際處理的機制
- 內(nèi)存:大腦中的記憶塊區(qū),將眼睛锡移,皮膚等收集到的信息記錄起來的地方,以供cpu進(jìn)行判斷漆际,但是是臨時的淆珊,訪問速度快,如果關(guān)機或斷電這里的數(shù)據(jù)會消失奸汇。
- 磁盤IO:大腦中的記憶區(qū)塊施符,將重要的數(shù)據(jù)保存起來(永久保存,關(guān)機或斷電不會丟失擂找,速度慢)戳吝,以便將來再次使用這些數(shù)據(jù)。
- 網(wǎng)絡(luò):
模擬用戶的真實贯涎、峰值和異常的請求量(單位時間的請求數(shù)量*單位請求內(nèi)容大刑蕖)去訪問系統(tǒng),監(jiān)控其性能情況(TPS塘雳、響應(yīng)時間和資源利用率)并獲取陆盘。
需要準(zhǔn)備什么?
環(huán)境選擇:與線上保持一致
系統(tǒng)環(huán)境
- 線上或者uat環(huán)境
- 數(shù)據(jù)請求打標(biāo)簽,區(qū)分測試數(shù)據(jù)與真實數(shù)據(jù)
- 增加測試擋板
- 優(yōu)點:不需要搭建環(huán)境和監(jiān)控
- 缺點:只能選擇流量空閑期,不能進(jìn)行過高的壓測,測試時候要及時跟開發(fā)溝通(線上異常警告)
- 搭建環(huán)境
- 組網(wǎng)模型: 需要評估測試組網(wǎng)與生產(chǎn)組網(wǎng)差異败明,至少滿足最低配置要求
- 組網(wǎng)類型:單機/雙機/單機集群/雙機集群/各種組合類型
- 硬件: cpu/內(nèi)存/磁盤讀寫/網(wǎng)卡
- 軟件:操作系統(tǒng)類型/服務(wù)/數(shù)據(jù)庫/文件庫/第三方組件
- 消息交互:同步/異步
- 數(shù)據(jù)模型
- 系統(tǒng)初始數(shù)據(jù):
- 分析系統(tǒng)上線后數(shù)據(jù)量/歷史數(shù)據(jù)
- 計算出系統(tǒng)每個階段數(shù)據(jù)容量隘马,數(shù)據(jù)類型,數(shù)據(jù)比例
- 根據(jù)不同階段分別進(jìn)行數(shù)據(jù)預(yù)制
- 測試新增數(shù)據(jù):
- 業(yè)務(wù)場景確定后根據(jù)具體業(yè)務(wù)場景定義輸入和輸出數(shù)據(jù)
- 結(jié)合具體的呼叫模型進(jìn)行數(shù)據(jù)預(yù)制
- 系統(tǒng)初始數(shù)據(jù):
- 組網(wǎng)模型: 需要評估測試組網(wǎng)與生產(chǎn)組網(wǎng)差異败明,至少滿足最低配置要求
執(zhí)行機環(huán)境
- 網(wǎng)絡(luò)與用戶保持一致
- 組網(wǎng):單機(4U8G)一般只能支持2000tps左右)妻顶,場景超過需要更高的配置
-
調(diào)優(yōu)
- 網(wǎng)絡(luò)設(shè)置
- 測試軟件
- 系統(tǒng)對軟件的限制
測試工具 :與開發(fā)技術(shù)棧一致
- ApacheBench: Apache 服務(wù)器自帶的一個web壓力測試工具酸员,簡稱ab
- Wrk:一款針對 Http 協(xié)議的基準(zhǔn)測試開源工具,支持lua腳本
- Apache JMeter(常用): Java 編寫的應(yīng)用程序,支持插件和jar包.
- Locust:一個開源負(fù)載測試工具讳嘱。使用 Python 代碼定義用戶行為幔嗦,也可以仿真百萬個用戶。
- LoadRunner(付費專業(yè)):HP公司提供的一款性能測試工具沥潭,通過模擬成千上萬個用戶實施并發(fā)操作崭添,測試系統(tǒng)的性能,并且提供詳細(xì)的測試結(jié)果分析叛氨,協(xié)助用戶查找問題呼渣。
- Spirent(付費專業(yè)):自帶硬件的大流量網(wǎng)絡(luò)測試儀
監(jiān)控軟件
場景建模
出發(fā)點
- 界面反應(yīng)慢
- 界面卡頓甚至無響應(yīng)
- 請求超時
- 使用過程中程序閃退
- 高峰時期程序報錯
需要考慮的問題
- 模擬與真實場景、真實組網(wǎng)和真實數(shù)據(jù)之間的差異性
- 測試過程中的執(zhí)行模型問題(緩存)
- 測試執(zhí)行過程中的資源監(jiān)控問題
- 行業(yè)或者同行標(biāo)準(zhǔn)
否則結(jié)果與現(xiàn)實存在很大差距寞埠,測試結(jié)果不準(zhǔn)確
場景選取
- 分析用戶使用場景屁置,掌握用戶需求(秒殺或者持續(xù)請求)
- 提煉用戶關(guān)注度較強的功能
- 分析用戶操作頻繁的功能
- 分析系統(tǒng)中可能的大數(shù)據(jù)量操作【文件讀寫,圖片瀏覽仁连,事務(wù)隊列蓝角,事務(wù)機制】
- 分析系統(tǒng)關(guān)鍵功能【后臺服務(wù)阱穗,緩存,調(diào)用的功能組件】
- 分析用戶組合航警使鹅,操作比例以及操作時延
執(zhí)行模型
- 壓力測試
- 負(fù)載測試
- 性能測試
測試過程中有哪些內(nèi)容揪阶?
系統(tǒng)瓶頸分析
整體思路:從前到后,從表象到內(nèi)部
- 首先排除壓力機自身的問題患朱,如CPU鲁僚、內(nèi)存,網(wǎng)絡(luò)裁厅,腳本編寫等
- 監(jiān)控中間件的訪問日志冰沙,觀察響應(yīng)時間,大體確定耗時處于哪一段
- 排查網(wǎng)絡(luò)問題执虹,監(jiān)控壓力機到后端服務(wù)器的網(wǎng)絡(luò)拓挥,以及各服務(wù)器間的網(wǎng)絡(luò),是否達(dá)到網(wǎng)絡(luò)上限
- 監(jiān)控服務(wù)端所有機器的操作系統(tǒng)負(fù)載袋励,如CPU侥啤、內(nèi)存、磁盤茬故、網(wǎng)絡(luò)是否達(dá)到瓶頸
- 監(jiān)控應(yīng)用服務(wù)器的日志愿棋,查看是否存在ERROR日志,比如TimeOut或其他類型報錯
- 監(jiān)控各中間件的連接數(shù)均牢,如nginx糠雨、tomcat、mysql等徘跪,是否達(dá)到上限
- 監(jiān)控應(yīng)用程序線程狀態(tài)甘邀,使用jstack或jvisualvm查看是否有死鎖、阻塞等情況
- 監(jiān)控應(yīng)用程序的jvm垮庐,使用jstat或者jmap查看GC情況松邪,是否內(nèi)存泄漏等
- 使用jprofiler監(jiān)控應(yīng)用程序,可以查看耗時比較長的代碼方法
- 監(jiān)控數(shù)據(jù)庫哨查,是否存在慢查詢逗抑,一般數(shù)據(jù)庫CPU高都是因為SQL語句效率低造成的
- 在sql語句前加上explain,可以分析這條sql語句的執(zhí)行情況 explain select * from teacher
- Type列可能的值
Const:表中只有一個匹配行寒亥,用到primary key或unique key
Eq_ref:唯一性索引掃描邮府,key的所有部分被連接聯(lián)接查詢使用,且key是unique或primary key
ref:非唯一性索引掃描溉奕,或只使用了聯(lián)合索引的最左前綴
Range:索引范圍掃描褂傀,在索引列上進(jìn)行給定范圍內(nèi)的檢索,如between加勤,in(1,100)
Index:遍歷索引...
All:全表掃描
Prossible key:使用哪個索引能找到行
Keys:sql語句使用的索引
rows:mysql 根據(jù)索引選擇情況仙辟,估算查找數(shù)據(jù)所需讀取的行數(shù)
- Type列可能的值
- 聯(lián)合索引
- 連接數(shù)
- 數(shù)據(jù)庫架構(gòu)優(yōu)化
- 讀寫分離同波,主從配置
- 硬件調(diào)優(yōu)
- 在sql語句前加上explain,可以分析這條sql語句的執(zhí)行情況 explain select * from teacher
- 檢查數(shù)據(jù)庫執(zhí)行計劃,是否有全表掃描叠国,以及索引不生效的情況
- 檢查系統(tǒng)外部依賴情況未檩,如果外部依賴系統(tǒng)性能差,也會造成本系統(tǒng)性能低
- 對于不好定位的問題粟焊,可以考慮采用模塊隔離法來確定問題
優(yōu)化方案
- sql
- 在 where 及 order by 涉及的列上建立索引冤狡,避免全表掃描,索引不要太多吆玖,一個表一般不要
超過4個索引 - 避免在 where 子句中對字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
- 查詢語句中不要使用 *马篮,減少內(nèi)存使用
- 盡量減少子查詢沾乘,使用關(guān)聯(lián)查詢(left join,right join,inner join)替代
- 減少使用IN或者NOT IN ,使用exists,not exists或者關(guān)聯(lián)查詢語句替代
- or 的查詢盡量用 union或者union all 代替(在確認(rèn)沒有重復(fù)數(shù)據(jù)或者不用剔除重復(fù)數(shù)據(jù)時浑测,
union all會更好) - 合理的增加冗余的字段(減少表的聯(lián)接查詢)
- 建表的時候能使用數(shù)字類型的字段就使用數(shù)字類型(type,status...)翅阵,數(shù)字類型的字段作為條件查詢比字符串的快
- 在 where 及 order by 涉及的列上建立索引冤狡,避免全表掃描,索引不要太多吆玖,一個表一般不要
- 代碼
- 使用對象池減少對重復(fù)對象的創(chuàng)建;
- 調(diào)整對后端的連接
- 增加本地緩存
- 如果不涉及事務(wù)的情況下迁央,考慮使用Nosql進(jìn)行存儲
- 一次請求合并多次操作
- 由串行修改為并行操作
- 同步修改為異步
測試注意點
- 記錄性能指標(biāo)(數(shù)值和圖片)
- 監(jiān)控請求是否正常,分析失敗原因
- 測試總體曲線是否呈現(xiàn)波峰或者隨著請求量增大趨于水平
測試報告
- 測試場景
- 結(jié)果與分析
- 結(jié)論
- 風(fēng)險點