壓力測試需要掌握的幾個核心技術


在深入測試工作的那段時間,筆者發(fā)現(xiàn)測試人員因為工作邊界模糊,大部分時間和精力都花在了功能測試上,而對于質(zhì)量測試、自動化測試等擴展性強的工作,所花時間和精力很少,這是一件可悲的事情,但這是很多公司內(nèi)都存在的現(xiàn)象。導致這種現(xiàn)象的原因有很多,其中一個讓人特別頭疼的問題就是自動化測試的覆蓋速度遠遠達不到產(chǎn)品變化的速度,所以很多人失去了信心,選擇老老實實地做功能測試。
在穩(wěn)定性建設中,SRE工程師不僅需要擁有測試視角,還需要讓測試團隊中有拼勁的人加入穩(wěn)定性建設的隊伍,擴展他們的職責邊界,讓專人做專事,打造技術風險團隊。
壓力測試
我們會介紹一些實操性強并且特別適合運維人員入門的測試工具,對于壓力測試(以下簡稱壓測),我們需要掌握如下幾個核心技術。
(1)理解系統(tǒng)負載出現(xiàn)瓶頸的原因,通過各種性能分析工具perf、bpftools、strace發(fā)現(xiàn)系統(tǒng)負載高的原因。下圖來自大師Brendan Gregg的bcc-tools的內(nèi)容(筆者實際工作中使用的很多分析方法都借鑒了這張圖)。
(2)針對不同的壓力,進行容量規(guī)劃,這樣后續(xù)的大促活動,日常的高峰、低谷流量,會有更好的基準數(shù)據(jù)進行對比。
(3)壓測中可能會遇到因為鏈路過長導致的性能問題,很多時候代碼變更會逐漸導致服務的鏈路被拉長,進而導致一個客戶端的請求從入口到后端經(jīng)過很多服務,經(jīng)過的服務越多,網(wǎng)絡耗時就越長,并且各項序列化操作還會造成資源開銷增加,因此縮短鏈路會成為優(yōu)化的重點。
壓測黑名單思維
通常,我們在評估一個服務的性能或容量規(guī)劃時,需要做一系列壓測,壓測中包含單應用、全鏈路等的訴求,并且會通過不同的并發(fā)請求量測試服務的響應能力。
基于前面章節(jié)中介紹的URI指紋服務設計思路,其實也可以產(chǎn)生一個壓測黑名單思路,比如,如果新增的URI服務沒有進行過壓測,那么將無法上線,通過這種類型的配合,可以避免新服務在沒有驗證各項性能指標的前提下就匆匆上線。
壓測利器Wrk
壓測中運維人員經(jīng)常使用ab、webbench這種輕量級性能壓測工具,下面要介紹的是壓測利器Wrk。
Wrk是一個開源HTTP基準測試工具,結合了多線程設計和可擴展的事件通知系統(tǒng),如epoll和kqueue,這對于一些需要模擬上萬并發(fā)請求量的壓測工具來說,需要消耗的資源更少,更容易被隨時隨地使用。
Wrk工具內(nèi)置了LuaJIT腳本功能,可以設計出較為復雜的HTTP請求生成、響應處理和自定義報告。下圖是Wrk GitHub上的工具功能說明。

在簡單的單接口壓測中,推薦使用Wrk工具。
流量鏡像工具GoReplay
在全鏈路壓測中,我們時常會用模擬用戶請求的方式來實現(xiàn)壓測,比較常見的一種場景是流量鏡像,使用線上用戶的真實操作通過流量回放的方式,在測試環(huán)境下實現(xiàn)模擬效果。流量鏡像工具有tcpdump、tcpcopy、ngx_http_mirror_module,以及基于日志回放的各種工具,下面我們介紹一下上手便捷且實用性強的HTTP流量鏡像工具GoReplay。
GoReplay是使用Go語言編寫的開源HTTP實時流量復制工具,將它安裝在入口HTTP反向代理服務器上即可實現(xiàn)線上實時流量的復制和鏡像。它還支持將收集到的流量數(shù)據(jù)進行放大和縮?。ㄈ缈梢宰远x放大10倍請求量),并且能將流量數(shù)據(jù)存放到Kafka中,方便后續(xù)執(zhí)行更多自定義操作。
在這里,我們只講解流量回放過程中需要注意的一些細節(jié),可參考官網(wǎng)上的使用手冊。
核心問題,比如進行流量回放時,一定要謹慎操作,不要寫錯目標地址,有如下幾種方式規(guī)避錯誤。
(1)將GoReplay封裝到腳本中,盡量不要直接使用gor命令,每次執(zhí)行流量回放操作的時候都通過腳本來完成,在腳本中對--output-http 參數(shù)進行判斷,只需要將流量回放到指定的IP和端口,減少人工寫錯IP的可能性。
(2)也可以利用--output-file參數(shù),將流量回放的數(shù)據(jù)存放到硬盤,并在最后復制到測試環(huán)境進行回放(測試環(huán)境和線上環(huán)境應該進行VPC隔離)。
(3)將流量收集、加入變更管控中,操作前需要進行二次確認。
(4)流量回放時,在第一次初始化過程中,默認只提供GET方法,等確認流程順暢后,再開啟其他方法的回放,比如POST方法。
注意:如果是喜歡使用Nginx做流量入口的用戶,也可以考慮使用ngx_http_mirror_ module,Nginx在1.13.4版本中推出了自己的流量鏡像模塊,使用很方便,但是需要修改入口的Nginx配置文件,這屬于線上變更,且靈活度較差,適合簡單的流量鏡像需求。
另外,GoReplay還可用于抓取HTTP包,執(zhí)行以下命令可以抓取從80端口傳入的HTTP請求:
./gor --input-raw :80 --output-stdout
接著會出現(xiàn)如下圖所示的每個HTTP請求傳入時顯示的HTTP報文內(nèi)容。

本文節(jié)選自《高性能之道: SRE視角下的運維架構實踐》
電子工業(yè)出版社出版
書里以SRE的視角,提供了關于運維架構實踐的寶貴經(jīng)驗,值得推薦閱讀
京東現(xiàn)在有滿100-50的活動,有需要可以入手學習
如果喜歡本文 歡迎 在看丨留言丨分享至朋友圈 三連
