一、背景介紹
為什麼需要壓測服務?首先,我們需要搞清楚做壓力測試這件事情的意義。使用壓力測試的本質是基于實際的生産業務場景、系統環境,模拟海量的使用者請求和資料對整個業務鍊進行壓力測試并持續調優,而壓力測試的意義則在于保障生産環境服務的可用性。
在日常研發流程中,每個工程師除了編寫代碼、review代碼、送出代碼、單元測試、內建測試外,還需要負責對自己所編寫的功能子產品進行24小時或者72小時的壓力測試。壓測除了可以驗證邏輯是否正确外,還能暴露出是否有性能短闆。比如原功能子產品平均響應時間為200ms,在新代碼邏輯加入後平均響應時間有沒有出現較大波動尤其是耗時有沒有明顯增加。耗時增加會帶來整個服務的抖動、熔斷、甚至于降級。
壓測服務除了具備管控研發流程意義外,更重要的是可以對線上服務容量評估。
簡單想象一個資訊流業務場景,當百萬或者千萬級别使用者主動重新整理浏覽新聞,這背後實際上是海量的并發性請求,請求行為會從CDN到web接入層、前端應用、後端服務、DB緩存、存儲、中間件等,整條鍊路都會面臨着請求流量。無論服務部署環境是公有雲、專有雲、混合雲還是自建IDC,高并發帶來的問題挑戰,需要我們能夠全局瓶頸識别,對待業務容量評估和資源規劃可以做到盡可能客觀。
總所周知,應用的服務狀态除了會受到自身穩定性的影響,還會受到流量等環境因素的影響,比如熱點新聞、重大營運活動、正常流量峰值時間段(早上08:00~10:00、晚上20:00~23:00)。以上的未知情況帶來的影響面會傳遞到服務的上下遊,上下遊某個環節如果出現了評估誤差,會帶來成倍的影響,最終可能會導緻服務災難性的影響。
二、壓測工具選擇
Apache JMeter是Apache組織開發的基于Java的壓力測試工具。用于對軟體做壓力測試,它最初被設計用于Web應用測試,但後來擴充到其他測試領域。它可以用于測試靜态和動态資源,例如靜态檔案、Java 小服務程式、CGI 腳本、Java 對象、資料庫、FTP 伺服器, 等等。JMeter 可以用于對伺服器、網絡或對象模拟巨大的負載,來自不同壓力類别下測試它們的強度和分析整體性能。
使用JMeter 進行壓測,隻需要設定較少的參數即可。核心的參數有壓測QPS、壓測時長、壓測IP、壓測端口等。
打開,conf.jmx檔案,修改以下配置資訊:

圖一:配置壓測qps與壓測時長
圖二:目标機器與端口
三、壓測展示
壓測前,我們提前準備好api調用時所使用的測試url,為了保證壓測可以盡可能還原真實情況,建議使用真實的使用者uid來進行仿真測試。測試url為1w 條即可。 壓測配置檔案設定完成後,便可以運作啟動腳本。 如sh run_start.sh。測試腳本啟動後,并可以觀察目标機器的負載情況了。
**壓測細節如下:
壓力測試目标:推薦引擎的排序服務、召回服務
壓力測試qps:300
目标機器型号:阿裡雲 ECS ecs.g6.8xlarge
配置:cpu 32核/記憶體 128GB/系統盤40GB 資料盤500GB**
從上圖可以看到,壓測開始後cpu與記憶體的監控曲線開始飙升。經24小時持續壓測後,相關性能名額滿足生産環境标準。同時也驗證得出阿裡雲ECS 滿足高并發極限條件下的穩定性考核。
四、未來展望
目前,全鍊路壓測的自動化隻是針對測試執行範疇,還有很多工作需要人工幹預,未來希望能夠将自動化的腳步覆寫到測試前和測試後,真正建設出全鍊路壓測的自動化生态體系。與此同時,我們正在調研阿裡雲性能測試PTS工具(雲産品),以此釋放出這部分工作的人力,可讓工程師更加專注業務研發。