在行業(yè)中,"壓力測試"(簡稱"壓測")是一個(gè)常聽到的術(shù)語。你可能在項(xiàng)目開發(fā)過程中親自進(jìn)行過壓力測試,因此對(duì)你來說這不是個(gè)新概念。想象一下你進(jìn)行壓力測試的方式,是否與許多人相同:首先建立一個(gè)與生產(chǎn)環(huán)境功能匹配的測試環(huán)境,并導(dǎo)入或生成一系列測試數(shù)據(jù)。接著,在另一臺(tái)服務(wù)器上啟動(dòng)多個(gè)線程,以并發(fā)方式調(diào)用待測試的接口(接口參數(shù)通常設(shè)置為相同的,例如,在測試獲取商品信息的接口時(shí),可能會(huì)使用相同的商品ID進(jìn)行壓測)。最終,通過分析訪問日志或檢查測試環(huán)境的監(jiān)控系統(tǒng),記錄壓測期間的QPS(每秒查詢率),然后報(bào)告測試結(jié)果。這個(gè)過程的描述,雖然換了一種說法,但意義基本相同。
使用線上數(shù)據(jù)和環(huán)境:進(jìn)行壓力測試時(shí),最佳做法是直接使用實(shí)際的線上數(shù)據(jù)和環(huán)境。這是因?yàn)樽孕写罱ǖ臏y試環(huán)境可能與生產(chǎn)環(huán)境存在差異,這些差異可能會(huì)影響到壓力測試的準(zhǔn)確性。
采用線上流量而非模擬請求:為了確保測試結(jié)果的有效性,應(yīng)該使用真實(shí)的線上流量進(jìn)行壓力測試,而不是依賴于模擬請求。這可以通過流量復(fù)制技術(shù)實(shí)現(xiàn),將實(shí)際的線上流量復(fù)制到測試環(huán)境中。這樣做的原因是,模擬流量可能無法準(zhǔn)確反映線上流量的真實(shí)行為模式,尤其是在訪問模型和緩存命中率等方面,可能與實(shí)際情況大相徑庭。
分散流量源,避免單點(diǎn)壓力:不應(yīng)該只從一臺(tái)服務(wù)器發(fā)起所有測試流量,因?yàn)檫@樣很容易觸達(dá)單臺(tái)服務(wù)器的性能瓶頸,從而影響整體的壓力測試結(jié)果。為了更準(zhǔn)確地模擬用戶的真實(shí)請求,應(yīng)該將產(chǎn)生流量的機(jī)器分布在地理位置上靠近最終用戶的地點(diǎn),比如CDN節(jié)點(diǎn)。如果條件不允許,至少也應(yīng)該在不同的數(shù)據(jù)中心或機(jī)房內(nèi)分布流量生成點(diǎn),以增強(qiáng)測試結(jié)果的真實(shí)性和可靠性。
錯(cuò)誤之處主要有以下幾點(diǎn):
壓力測試是在高并發(fā)大流量條件下對(duì)系統(tǒng)進(jìn)行的測試,旨在觀察系統(tǒng)在峰值負(fù)荷下的表現(xiàn),以發(fā)現(xiàn)性能隱患。這是發(fā)現(xiàn)系統(tǒng)問題和確保系統(tǒng)穩(wěn)定性與可用性的關(guān)鍵方法。以下是對(duì)上述描述的簡化和標(biāo)號(hào)概述:
定義與目的:壓力測試是在極端負(fù)載條件下進(jìn)行的測試,用于觀察和評(píng)估系統(tǒng)在面臨高并發(fā)和大流量時(shí)的性能。這種測試幫助識(shí)別潛在的性能瓶頸,是維持系統(tǒng)穩(wěn)定性和可用性的重要工具。
全鏈路壓測的必要性:不應(yīng)僅對(duì)系統(tǒng)的某個(gè)核心模塊進(jìn)行壓力測試,而需要將接入層、后端服務(wù)、數(shù)據(jù)庫、緩存、消息隊(duì)列、中間件以及依賴的第三方服務(wù)和資源全面納入測試范圍。這種全方位的測試,也稱為全鏈路壓測,是因?yàn)橄到y(tǒng)的任何部分在用戶訪問量激增時(shí)都可能成為性能瓶頸。
周期性測試與自動(dòng)化平臺(tái)的建設(shè):隨著互聯(lián)網(wǎng)項(xiàng)目功能的快速迭代和系統(tǒng)復(fù)雜性的增加,定期進(jìn)行壓力測試變得尤為重要。全鏈路壓測通常需要跨團(tuán)隊(duì)合作,包括DBA、運(yùn)維團(tuán)隊(duì)和依賴服務(wù)方等,帶來較高的人力和協(xié)調(diào)成本。為減少這些成本和潛在的線上風(fēng)險(xiǎn),建立一套自動(dòng)化的全鏈路壓測平臺(tái)是解決方案之一。
搭建全鏈路壓測平臺(tái),主要有兩個(gè)關(guān)鍵點(diǎn)。
一點(diǎn)是流量的隔離。由于壓力測試是在正式環(huán)境進(jìn)行,所以需要區(qū)分壓力測試流量和正式流量,這樣可以針對(duì)壓力測試的流量做單獨(dú)的處理。
另一點(diǎn)是風(fēng)險(xiǎn)的控制。也就是盡量避免壓力測試對(duì)于正常訪問用戶的影響。因此,一般來說全鏈路壓測平臺(tái)需要包含以下幾個(gè)模塊:流量構(gòu)造和產(chǎn)生模塊;壓測數(shù)據(jù)隔離模塊;系統(tǒng)健康度檢查和壓測流量干預(yù)模塊:
整體壓測平臺(tái)的架構(gòu)圖可以是下面這樣的:
為了實(shí)施壓力測試,系統(tǒng)入口流量的復(fù)制是一項(xiàng)基礎(chǔ)工作。這些流量數(shù)據(jù),在經(jīng)過清洗(如過濾無效請求)后,可存儲(chǔ)于NoSQL數(shù)據(jù)庫或云存儲(chǔ)服務(wù)中,形成所謂的流量數(shù)據(jù)工廠。當(dāng)進(jìn)行壓測時(shí),可從此工廠獲取數(shù)據(jù),并將其分配至多個(gè)壓測節(jié)點(diǎn)。在這一過程中,有幾個(gè)關(guān)鍵點(diǎn)需要特別注意:
流量復(fù)制的方法:可以直接復(fù)制負(fù)載均衡服務(wù)器的訪問日志到流量數(shù)據(jù)工廠,盡管這種方法在壓測時(shí)增加了解析日志的成本。另一種推薦方法是使用開源工具,如GoReplay,來拷貝特定端口的流量,并將其保存至流量數(shù)據(jù)工廠,同時(shí)支持壓測時(shí)的流量回放。
壓測流量的分發(fā):為確保壓測的真實(shí)性,下發(fā)壓測流量的節(jié)點(diǎn)應(yīng)盡量接近用戶地理位置,而不是和服務(wù)部署節(jié)點(diǎn)位于同一機(jī)房。
流量染色:為了區(qū)分壓測流量和實(shí)際用戶流量,在HTTP請求頭中增加壓測標(biāo)記,如is stress test
,這樣在流量復(fù)制后,可以批量標(biāo)記請求,確保壓測的準(zhǔn)確執(zhí)行和監(jiān)控。
在進(jìn)行壓力測試時(shí),除了復(fù)制流量以模擬真實(shí)的用戶請求外,還需要對(duì)系統(tǒng)進(jìn)行改造,以實(shí)現(xiàn)壓測流量與正式流量的隔離。這樣的隔離可以最大限度減少壓力測試對(duì)線上系統(tǒng)的影響。具體而言,需要從兩個(gè)方面進(jìn)行工作:
對(duì)下行流量的處理:對(duì)于讀取數(shù)據(jù)的請求(通常稱為下行流量),某些服務(wù)或組件不適合進(jìn)行壓測。例如,在記錄用戶行為數(shù)據(jù)時(shí),壓測可能會(huì)導(dǎo)致大量的假數(shù)據(jù)生成,如商品瀏覽量的人為膨脹,這會(huì)影響到業(yè)務(wù)報(bào)表,進(jìn)而影響產(chǎn)品或業(yè)務(wù)決策。為避免這種情況,需要對(duì)壓測產(chǎn)生的數(shù)據(jù)進(jìn)行特殊處理,比如不將這些數(shù)據(jù)記錄到大數(shù)據(jù)日志中。
另外,考慮到系統(tǒng)可能依賴于推薦服務(wù)來展示用戶可能感興趣的商品,而這些服務(wù)通常不會(huì)重復(fù)推薦已展示的商品。如果壓測流量通過這些推薦服務(wù),可能會(huì)導(dǎo)致大量商品被“消耗”,影響線上用戶的推薦效果。因此,需要對(duì)這部分服務(wù)進(jìn)行Mock處理,即讓帶有壓測標(biāo)記的請求經(jīng)過Mock服務(wù),而非真實(shí)的推薦服務(wù)。
Mock服務(wù)的部署:在搭建Mock服務(wù)時(shí),應(yīng)注意將這些服務(wù)部署在與真實(shí)服務(wù)相同的機(jī)房內(nèi)。這樣做的目的是為了盡可能地模擬真實(shí)的服務(wù)部署結(jié)構(gòu),從而提高壓測結(jié)果的真實(shí)性。部署在相同機(jī)房內(nèi)的Mock服務(wù)可以更準(zhǔn)確地反映出服務(wù)間的調(diào)用延遲和處理能力,確保壓測結(jié)果的可靠性。
對(duì)于寫入數(shù)據(jù)的請求(通常稱作上行流量),實(shí)現(xiàn)壓測流量與正式流量隔離的一個(gè)重要策略是使用影子庫。影子庫是一個(gè)與線上數(shù)據(jù)存儲(chǔ)完全隔離的存儲(chǔ)系統(tǒng),用于存儲(chǔ)壓測期間產(chǎn)生的所有寫入數(shù)據(jù)。這種隔離確保了壓測不會(huì)影響到真實(shí)的生產(chǎn)數(shù)據(jù),同時(shí)允許我們在一個(gè)盡可能接近真實(shí)環(huán)境的設(shè)置中測試寫入操作的性能。具體到不同的存儲(chǔ)類型,影子庫的實(shí)現(xiàn)方式也有所不同:
MySQL影子庫:對(duì)于存儲(chǔ)在MySQL中的數(shù)據(jù),可以在同一個(gè)MySQL實(shí)例中創(chuàng)建一個(gè)不同的Schema,其中包含一套與線上相同的庫表結(jié)構(gòu)。同時(shí),為了模擬真實(shí)的數(shù)據(jù)環(huán)境,還需要將線上數(shù)據(jù)導(dǎo)入到這個(gè)影子庫中。這樣做可以確保壓測環(huán)境在數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)量上都盡可能接近真實(shí)環(huán)境,從而提高測試的準(zhǔn)確性和可靠性。
Redis影子庫:對(duì)于存儲(chǔ)在Redis中的數(shù)據(jù),可以通過為壓測流量產(chǎn)生的數(shù)據(jù)增加一個(gè)統(tǒng)一的前綴,并存儲(chǔ)在同一份Redis實(shí)例中。這種方法通過命名空間的隔離來區(qū)分正式數(shù)據(jù)和壓測數(shù)據(jù),既保持了數(shù)據(jù)隔離,又避免了搭建完全獨(dú)立的存儲(chǔ)系統(tǒng)的復(fù)雜性和成本。
Elasticsearch影子庫:針對(duì)存儲(chǔ)在Elasticsearch中的數(shù)據(jù),可以選擇將壓測數(shù)據(jù)放在一個(gè)單獨(dú)的索引中。這樣的做法便于管理和隔離壓測數(shù)據(jù),同時(shí)也方便在壓測結(jié)束后對(duì)這部分?jǐn)?shù)據(jù)進(jìn)行清理或分析。
在完成線上流量復(fù)制和線上系統(tǒng)改造后,便可以開始實(shí)施壓力測試。通常,壓力測試前會(huì)設(shè)定一個(gè)目標(biāo),例如要求系統(tǒng)整體QPS達(dá)到每秒20萬次。但是,在測試中不會(huì)突然將請求量提升至每秒20萬次,而是會(huì)逐步增加,例如每次增加一萬QPS,然后讓系統(tǒng)穩(wěn)定運(yùn)行一段時(shí)間以觀察其性能表現(xiàn)。如果檢測到任何服務(wù)或組件成為性能瓶頸,就會(huì)減少壓測流量至上一次的QPS水平以維護(hù)服務(wù)穩(wěn)定,并對(duì)相關(guān)服務(wù)或組件進(jìn)行擴(kuò)容處理后再次增加流量進(jìn)行測試。
為了降低壓力測試過程中的人力成本,開發(fā)流量監(jiān)控組件是一個(gè)有效策略。該組件可以預(yù)設(shè)性能閾值,例如設(shè)定容器CPU使用率的閾值為60%-70%,系統(tǒng)平均響應(yīng)時(shí)間不超過1秒,慢請求比例不超過1%等。一旦系統(tǒng)性能觸及這些閾值,流量監(jiān)控組件便能及時(shí)發(fā)現(xiàn)并通知減少壓測流量,同時(shí)向開發(fā)和運(yùn)維團(tuán)隊(duì)發(fā)出報(bào)警。這樣,團(tuán)隊(duì)便能快速識(shí)別并解決性能瓶頸問題,完成必要的擴(kuò)容后繼續(xù)進(jìn)行壓力測試。
在全鏈路壓測平臺(tái)的探索方面,眾多大型互聯(lián)網(wǎng)公司如阿里、京東、美團(tuán)和微博等都已經(jīng)開發(fā)出適合自己業(yè)務(wù)需求的平臺(tái)。這些平臺(tái)雖然各有特點(diǎn),但基本遵循相同的原則,包括流量復(fù)制、流量隔離、壓力測試、監(jiān)控和熔斷等關(guān)鍵步驟,體現(xiàn)了全鏈路壓測的核心理念。因此,在自研適合自己項(xiàng)目的全鏈路壓測平臺(tái)時(shí),遵循這些已被驗(yàn)證的方法論是一個(gè)明智的選擇。
本文鏈接:http://www.tebozhan.com/showinfo-26-76572-0.html怎樣設(shè)計(jì)全鏈路壓力測試平臺(tái)?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
下一篇: C++中列表初始化,你知多少?