壓力測(cè)試需要掌握的幾個(gè)核心技術(shù)


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

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

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