一次實(shí)戰(zhàn)壓測流程及問題梳理!

1、背景及目的
在動手之前,先要想清楚我們期望從壓測中獲取的價(jià)值是什么。
這次壓測的背景,主要是為了應(yīng)對旺季到來,避免旺季的大量流量和高并發(fā)造成服務(wù)不可用,提升穩(wěn)定性。而在穩(wěn)定性建設(shè)中,也會從事前、事中及事后來看,包含的維度包含風(fēng)險(xiǎn)識別、監(jiān)控告警、應(yīng)急流程及故障復(fù)盤等不同的維度。
而其中,我們關(guān)注的主要包含三個(gè)維度,風(fēng)險(xiǎn)識別、監(jiān)控告警、熔斷降級和容量規(guī)劃。

2、壓測流程

1 - 場景圈選
圈選參與壓測的業(yè)務(wù)域、依賴服務(wù)及中間件、存儲等,確定壓測范圍及邊界,基于過往線上流量輸出壓測流量比例及目標(biāo)。

在確定壓測范圍的同時(shí),需要確定業(yè)務(wù)模塊中場景/接口的壓測目標(biāo),包括目標(biāo)QPS及響應(yīng)時(shí)間。
目標(biāo)QPS,我們是按照往年的流量或活躍用戶變化推算總目標(biāo)QPS的,然后按照相同的增長率計(jì)算單個(gè)場景/接口的目標(biāo)QPS值。其中,拆分出各個(gè)場景/接口的QPS值是很重要的,這樣才能按線上接口的流量比例進(jìn)行發(fā)壓。
預(yù)期響應(yīng)時(shí)間,以業(yè)務(wù)高峰時(shí)期正常的99線及平均響應(yīng)時(shí)間作為目標(biāo)值,這里不僅可以判斷服務(wù)性能是否有比較大的影響,同時(shí)也能輔助做容量規(guī)劃。
為什么和容量規(guī)劃有關(guān)系?
根據(jù)排隊(duì)論的思想,實(shí)際響應(yīng)時(shí)間=隊(duì)列等待時(shí)間+服務(wù)處理時(shí)間,隊(duì)列等待時(shí)間則和服務(wù)器資源有關(guān),資源少時(shí)就會處于隊(duì)列等待(CPU資源等待、池等待),耗時(shí)就會上升。同時(shí),在一些需要控制成本且對延時(shí)不那么敏感的場景下,就可以在保證服務(wù)正常且滿足預(yù)期響應(yīng)時(shí)間的情況下,減少服務(wù)實(shí)例。
2 - 服務(wù)改造
在壓測前,需要判斷圈選的壓測場景中是否包含無法支持或需要單獨(dú)適配、資源隔離等的場景,并提前做好改造。舉個(gè)栗子,如果場景中涉及到第三方資源調(diào)用(語音識別、天氣獲取等)時(shí),需要提前做好改造,否則壓測過程中大量消耗購買的服務(wù)資源次數(shù),就會導(dǎo)致費(fèi)用突增。

改造的方式也有很多,可以mock數(shù)據(jù)、做擋板、動態(tài)配置開關(guān)、固定時(shí)延返回等等。
目前做的比較好的廠,可以通過流量打標(biāo)識別壓測流量,字節(jié)碼注入改寫做到無侵入的擋板,數(shù)據(jù)也可以該寫入影子表中,實(shí)現(xiàn)線上環(huán)境的低成本壓測。
3 - 壓測準(zhǔn)備
對壓測過程需要的所有組件、數(shù)據(jù)、配置及環(huán)境進(jìn)行準(zhǔn)備,保證壓測環(huán)境本身正確無影響,可以順利執(zhí)行壓測任務(wù)。

其中,
組件部署,需要提前收集線上組件的配置,按相同配置或等比縮容的形式提前做好部署,準(zhǔn)備好域名、賬號等內(nèi)容;
腳本及數(shù)據(jù),我們使用的是基于JMeter自建的壓測平臺,會提前按全選場景準(zhǔn)備好壓測腳本,而壓測數(shù)據(jù)則根據(jù)線上高峰時(shí)段的請求數(shù)據(jù)為基礎(chǔ)進(jìn)行生成,進(jìn)行流量回放;
配置準(zhǔn)備,服務(wù)使用了配置中心,需要新建一套與線上隔離的配置,避免壓測過程中的參數(shù)調(diào)優(yōu)影響到線上;
環(huán)境驗(yàn)證,驗(yàn)證壓測腳本及數(shù)據(jù),并對基礎(chǔ)設(shè)施環(huán)境進(jìn)行測試,包含檢查流量外漏、基礎(chǔ)設(shè)施狀態(tài)等。
在環(huán)境驗(yàn)證上,我們也壓測驗(yàn)證了基礎(chǔ)環(huán)境的狀態(tài),在網(wǎng)關(guān)(APISIX)返回503時(shí)的鏈路情況。在壓力較大的情況下3~3.5ms返回,壓力小的時(shí)候1ms內(nèi)就返回。
4 - 壓測執(zhí)行
接下來就是壓測執(zhí)行階段了,我們除了對圈選的業(yè)務(wù)模塊進(jìn)行壓測外,也對熔斷、降級方案進(jìn)行了驗(yàn)證。

壓測過程中,除了服務(wù)本身的問題外(【記一次業(yè)務(wù)壓測過程中發(fā)現(xiàn)的問題】),我們在壓力評估及肉雞配置上踩了不少坑。
壓力評估
過往我們僅僅是通過CPU及內(nèi)存使用率來判斷容器壓力,但是這是非常不準(zhǔn)確的,一定要結(jié)合Load Average來看。
Load Average,描述系統(tǒng)處于RUNNABLE或UNINTERRUPTIBLE狀態(tài)的進(jìn)程,包含正在執(zhí)行、等待執(zhí)行以及不可中斷狀態(tài)的進(jìn)程,當(dāng)其大于CPU核數(shù)數(shù),此時(shí)的CPU負(fù)載很可能就是有壓力的。
關(guān)于
UNINTERRUPTIBLE狀態(tài)的進(jìn)程?表名進(jìn)程阻塞在磁盤IO或一些鎖上,因此Load Average也能側(cè)面反應(yīng)出磁盤IO負(fù)載,這種情況可以通過off-cpu火焰圖進(jìn)行分析。
一般我們通過top可以看到最近1分鐘、5分鐘及15分鐘的負(fù)載,但是實(shí)際上這三個(gè)值并不是準(zhǔn)確的Load Average,它計(jì)算是基于指數(shù)衰減的移動加權(quán)累加得到的,變化的速度會慢于真實(shí)的負(fù)載。

圖中為跑1個(gè)Thread時(shí)的負(fù)載,可以看到要到5分鐘后Load Average才跑到接近1左右。因此,想要觀察真正的負(fù)載需要保持一段時(shí)間的壓力,我們壓測時(shí)是按保持5分鐘壓力后的結(jié)果來定的。
容器內(nèi)的Load Average
top命令中的Load Average是讀取/proc/loadavg中的值,而在容器中,該目錄是掛載宿主機(jī)的/proc,因此top看到的是宿主機(jī)的負(fù)載,無法真正區(qū)分容器中的值。
這里推薦大佬張師傅基于topic修改的ctop來進(jìn)行觀察。
( github.com/arthur-zhan… )
肉雞配置及數(shù)量的評估
在壓測的發(fā)起端,底層是通過JMeter實(shí)現(xiàn)的,為了能夠保持一段時(shí)間的服務(wù)壓力,我們是通過控制并發(fā)數(shù)而非請求總數(shù)來進(jìn)行肉雞配置的,可以簡單的理解為1并發(fā)數(shù)就是一個(gè)線程持續(xù)的發(fā)起請求。
那么,如何將壓測目標(biāo)QPS轉(zhuǎn)化為并發(fā)數(shù)配置呢?一個(gè)線程持續(xù)的發(fā)起請求,那么QPS是未知的,要怎么找到最合適的并發(fā)數(shù)配置呢?
這里可以拆解兩步來分析:
單場景/接口壓測,找到單場景目標(biāo)QPS達(dá)成所需要的并發(fā)數(shù)。

這里有一個(gè)容易踩的坑,并發(fā)數(shù)的配置一定要在肉雞、服務(wù)實(shí)例均無壓力的情況下進(jìn)行評估,評估方法可以結(jié)合前面提到的Load Average及99線。如果肉雞壓力大,CPU資源緊張,線程等不到CPU資源分片,導(dǎo)致QPS上不去,99線也會高出很多。
全場景壓測,評估單臺肉雞的并發(fā)數(shù)配置及肉雞數(shù)。
由于單臺肉雞的配置有限,所能支撐的并發(fā)數(shù)也會太高,所以我們需要估算出單臺肉雞的并發(fā)數(shù)配置。
這里可能有一個(gè)誤區(qū),并發(fā)數(shù)并不是要小于等于CPU核數(shù)。實(shí)際能支撐的并發(fā)數(shù)和接口的響應(yīng)時(shí)間有關(guān)系,請求發(fā)出并等待返回的這段時(shí)間內(nèi),線程阻塞等待結(jié)果,此時(shí)是不占用CPU的。占用CPU的只有組裝和發(fā)送請求、解析和判斷返回的階段,中間的等待階段可以調(diào)度處理不同線程的任務(wù)。
這里的肉雞并發(fā)數(shù)配置也有兩種方式:
(1)按照單個(gè)場景/接口,單獨(dú)下發(fā)腳本和并發(fā)數(shù)。這樣做意味著不同的肉雞在執(zhí)行不同的壓測腳本,能更好的控制并發(fā)數(shù)和目標(biāo)QPS,但是需要能比較好的單獨(dú)控制腳本下發(fā)和并發(fā)數(shù)配置;
舉個(gè)栗子,
肉雞A,4C8GB,下發(fā)場景1和場景3腳本,按并發(fā)數(shù)9、14進(jìn)行多線程執(zhí)行;肉雞B,8C16GB,下發(fā)場景2腳本,按并發(fā)數(shù)112進(jìn)行多線程執(zhí)行。

這樣不同的肉雞配置各不相同,各自執(zhí)行特定的場景腳本,優(yōu)點(diǎn)是壓測中各場景的目標(biāo)QPS比較準(zhǔn)確,符合預(yù)期,但是無論是自動化或手動配置都比較繁瑣,無法快速批量擴(kuò)大壓測規(guī)模。
(2)按各場景不同的的并發(fā)數(shù)比例,計(jì)算單肉雞的并發(fā)配置,再按目標(biāo)并發(fā)數(shù)計(jì)算肉雞數(shù)量,批量下發(fā)腳本及并發(fā)數(shù)配置。

該方式下,每臺肉雞都會收到全部場景的腳本和并發(fā)數(shù)配置,只需批量下發(fā)即可,最終通過控制肉雞數(shù)量來達(dá)到全場景目標(biāo)QPS值,優(yōu)點(diǎn)是可以快速擴(kuò)大壓測規(guī)模,缺點(diǎn)是最終各場景的QPS比例可能偏差較大。
比如圖中的場景3,4并發(fā)*3肉雞=12并發(fā),小于目標(biāo)并發(fā)數(shù),此時(shí)無論增加單肉雞并發(fā)數(shù)還是肉雞數(shù)量,也都會導(dǎo)致實(shí)際并發(fā)數(shù)與目標(biāo)不一致。
其他
持續(xù)性壓測更多觀關(guān)注GC、有效吞吐占比及99線尖刺。
故障演練核心驗(yàn)證熔斷是否能按預(yù)期生效,限流降級方案演練及有效性驗(yàn)證,如果有應(yīng)急處理流程的話也可以進(jìn)行全流程的演練。
5 - 壓測總結(jié)及資源回收
這個(gè)階段沒什么好說的,總結(jié)過程、描述問題及解決方案、后續(xù)的優(yōu)化策略以及壓測流程、平臺的后續(xù)建設(shè)方向等都可以一起討論總結(jié)、沉淀為團(tuán)隊(duì)知識。
最后,最最重要的,不要忘了回收壓測資源,因?yàn)楹苜F。
3、總結(jié)
本文更多是對壓測流程上的一些經(jīng)驗(yàn)總結(jié),幫助找到合適的流程及方法來進(jìn)行壓測,后續(xù)也能基于流程不斷迭代更新。從過程上看,我們在壓測流程以及基礎(chǔ)設(shè)施的建設(shè)上還比較原始,依賴人工調(diào)整、評估,也能對未來的壓測平臺建設(shè)提供方向。
鏈接:https://juejin.cn/post/7141588790249783303
來源:稀土掘金
