突破性能CI

性能CI

什么是性能CI

性能CI可簡(jiǎn)單定義為CI(Continuous Integration)集成性能測(cè)試用例。主要用于監(jiān)控系統(tǒng)運(yùn)算速度、存儲(chǔ)容量或網(wǎng)絡(luò)I/O是否滿足系統(tǒng)設(shè)置指標(biāo),而非發(fā)現(xiàn)故障。

性能測(cè)試通常包括:負(fù)載測(cè)試(Load Test)、壓力測(cè)試(Stress Test)、容量測(cè)試(Volume Test)、峰值測(cè)試(Spike Test)等非功能型測(cè)試。


http://www.testingperformance.org/definitions/

性能CI的價(jià)值

性能優(yōu)化的博弈

一方面,Donald Knuth告訴我們“過(guò)早的優(yōu)化是萬(wàn)惡之源”,

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. - Computer Programming as an Art(1974) P671.

當(dāng)然,我并無(wú)意挑起性能狂人與設(shè)計(jì)大師們的戰(zhàn)爭(zhēng),但凡有些性能優(yōu)化經(jīng)驗(yàn)的同學(xué)定能理解其中要義,過(guò)早的優(yōu)化至少會(huì)帶來(lái)如下問(wèn)題:

  • 忽略整體設(shè)計(jì)
  • 陷入局部?jī)?yōu)化
  • 破壞可讀性
  • 增加偶發(fā)復(fù)雜度

另一方面,對(duì)于遺留系統(tǒng),發(fā)現(xiàn)性能問(wèn)題往往為時(shí)已晚。會(huì)帶來(lái):

  • 定位成本高
  • 優(yōu)化難度大
  • 波及影響多
  • 測(cè)試成本高

所以,我們期望做到:

  1. 開發(fā)人員專注于設(shè)計(jì)、編碼
  2. 提交代碼出現(xiàn)性能問(wèn)題及時(shí)告警
  3. 可視化性能數(shù)據(jù),并可鏈接到劣化代碼
  4. 提供定位信息協(xié)助分析

性能CI面臨的主要問(wèn)題

  1. 性能用例的有效性不高

    簡(jiǎn)言之,監(jiān)控的場(chǎng)景不能包含性能劣化路徑。表現(xiàn)為內(nèi)場(chǎng)表現(xiàn)良好,外場(chǎng)表現(xiàn)糟糕;局部性能良好,系統(tǒng)性能糟糕。

  2. 性能用例部署、執(zhí)行時(shí)間較長(zhǎng)

    CI要求更早、更快的反饋。性能測(cè)試受制于物理環(huán)境、儀表資源、采樣周期等限制,通常自動(dòng)化部署困難,用例執(zhí)行時(shí)間長(zhǎng)。

  3. 性能測(cè)試數(shù)據(jù)的穩(wěn)定性

    判決讓人信服的前提是準(zhǔn)確。由于不同的構(gòu)建機(jī)器、不同的部署環(huán)境、不同的用例配置、不同組件間的干擾、性能指示器數(shù)據(jù)的波動(dòng)等原因,性能測(cè)試數(shù)據(jù)出很大波動(dòng)性,導(dǎo)致難以判決劣化是由于合入代碼還是波動(dòng)所致。

  4. 自動(dòng)化準(zhǔn)確識(shí)別劣化點(diǎn)

    劣化閾值設(shè)置過(guò)大可能漏掉某些劣化點(diǎn),設(shè)置過(guò)小可能產(chǎn)生誤報(bào),準(zhǔn)確識(shí)別劣化點(diǎn)困難。另外,由于諸多約束,很多判斷需要人為干預(yù),完全自動(dòng)化較困難。

解決思路與方法

通過(guò)對(duì)性能CI面臨主要問(wèn)題的分析,核心要解決有效性、高效性、穩(wěn)定性、擴(kuò)展性四方面的問(wèn)題。

性能CI核心問(wèn)題
  1. 提高性能測(cè)試用例的有效性
  • 業(yè)務(wù)價(jià)值驅(qū)動(dòng),識(shí)別劣化路徑

    “程序的性能特質(zhì)傾向高度的非直覺性”,性能優(yōu)化靠猜是極其不告譜的。性能劣化路徑的識(shí)別亦如此,我們需要根據(jù)系統(tǒng)在真實(shí)部署環(huán)境的業(yè)務(wù)場(chǎng)景,選擇用例,確定用例部署優(yōu)先級(jí)。

  • 解耦系統(tǒng)內(nèi)不同組件間的干擾

    在一定程度上,可以對(duì)復(fù)雜系統(tǒng)的各個(gè)組件的性能分開驗(yàn)證,可以考慮犧牲一些不關(guān)注組件的真實(shí)性,換取關(guān)注組件的穩(wěn)定性。

  • 自動(dòng)準(zhǔn)確識(shí)別性能劣化點(diǎn)并分級(jí)告警

    自動(dòng)準(zhǔn)確的識(shí)別劣化點(diǎn),是判定性能CI是否有效的關(guān)鍵指標(biāo)。需要?jiǎng)討B(tài)找到某個(gè)閾值作為置信區(qū)間,我們可以參考異常檢測(cè)方法。常見的異常檢測(cè)方法有:極值分析,概率統(tǒng)計(jì)建模,線性回歸模型,信息論模型,高維孤立點(diǎn)檢測(cè)等。下面介紹一種實(shí)測(cè)中比較有效實(shí)時(shí)告警的方法:

    Mean(N) ± SD(N),其中N表示樣本容量,Mean表示平均值,SD表示標(biāo)準(zhǔn)差。樣本容量選取過(guò)去一段時(shí)間產(chǎn)生的樣本,不能選取過(guò)去的所有樣本,否則置信區(qū)間無(wú)法收斂。

    分級(jí)告警是指可以定義實(shí)時(shí)告警、觸頂告警等不同級(jí)別告警。

    數(shù)據(jù)告警
    • 實(shí)時(shí)告警:以過(guò)去一段時(shí)間的樣本作為實(shí)時(shí)告警模型的輸入并生成置信區(qū)間,當(dāng)前數(shù)據(jù)超出該區(qū)間則告警。
    • 觸頂告警:以某個(gè)初始基準(zhǔn)值作為參考,設(shè)置可以容忍的最大劣化/優(yōu)化閾值并生成置信區(qū)間,當(dāng)前數(shù)據(jù)超出該區(qū)間則告警。觸頂告警一般用于實(shí)時(shí)告警無(wú)法捕捉到的、緩慢增加的劣化的場(chǎng)景,觸頂告警一旦觸發(fā),預(yù)示需要啟動(dòng)專項(xiàng)優(yōu)化了。
  1. 提高性能測(cè)試用例的高效性
  • 測(cè)試用例分級(jí)部署

    分級(jí)部署是指將性能測(cè)試用例分級(jí)部署在單元測(cè)試,集成測(cè)試,系統(tǒng)測(cè)試等不同階段。用例間相互補(bǔ)充,可以更高效的利用測(cè)試資源,減少用例執(zhí)行時(shí)間。

  • 測(cè)試用例并行部署

    如果測(cè)試用例部署環(huán)境充足,考慮并行部署用例,可以大大縮短用例執(zhí)行時(shí)間,簡(jiǎn)化用例部署場(chǎng)景。

  • 不同構(gòu)建按不同粒度監(jiān)控

    如果做不到用戶每次提交在給定的時(shí)間窗內(nèi)給出執(zhí)行結(jié)果,可以考慮將多次提交打包成一次構(gòu)建執(zhí)行,出現(xiàn)告警后打包提交逐單回退驗(yàn)證(需要部署鏡像環(huán)境用于回退單驗(yàn)證)。

  • 尋求慢速性能指標(biāo)的替代指標(biāo)

    如果在用性能指示器的采樣周期較長(zhǎng),在不影響穩(wěn)定性的前提下,考慮尋求其他更快速性能指標(biāo)進(jìn)行替換。性能指標(biāo)包括:CPU Utilization,Latency,IPC(Or CPI),Cycles,Instructions,CacheMiss.

  1. 提高性能測(cè)試數(shù)據(jù)的穩(wěn)定性
  • 部分模擬環(huán)境代替真實(shí)物理環(huán)境

    真實(shí)物理環(huán)境相對(duì)于模擬環(huán)境更脆弱,更不易控制,在分級(jí)部署原則的指導(dǎo)下,對(duì)于不關(guān)注組件,可是考慮使用模擬環(huán)境代替真實(shí)物理環(huán)境。

  • 增加系統(tǒng)內(nèi)其他組件的穩(wěn)定性

    復(fù)雜系統(tǒng)是由多個(gè)組件組成,系統(tǒng)性能表現(xiàn)為它們共同作用的結(jié)果,通過(guò)打樁等手段,提高不關(guān)注組件的穩(wěn)定性,有利于提高被監(jiān)控組件的穩(wěn)定性。

  • 增大樣本容量(冗余)

    冗余是提高穩(wěn)定性最常用的方法,挑戰(zhàn)在于在樣本量增加情況下,如何不增加執(zhí)行時(shí)間。推薦使用Latency,IPC等指標(biāo)代替CPU使用率。

  • 多維度樣本參照(相關(guān)性)

    具有相關(guān)性、不同維度的性能數(shù)據(jù)相互參照,提高判定的準(zhǔn)確性。

  • 尋求波動(dòng)性能指標(biāo)替代指標(biāo)

    系統(tǒng)性越強(qiáng)的性能指示器(例如CPU使用率)波動(dòng)性越大,考慮使用一些可被拆分、組合的指示器(例如函數(shù)時(shí)延,Cycles等)替代。

  1. 提高性能用例的擴(kuò)展性
  • 抽象出框架與API接口
    良好的擴(kuò)展性基于對(duì)操作的抽象、良好的分層、穩(wěn)定的API接口,性能CI對(duì)日志數(shù)據(jù)的操作可以抽象為數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)持久化、數(shù)據(jù)可視化四層,每層定義清晰的API接口,性能用例僅需要新增配置即可。

    四層結(jié)構(gòu)
  • 工作環(huán)境與測(cè)試環(huán)境分離
    工作環(huán)境負(fù)責(zé)及時(shí)反饋性能劣化點(diǎn),鏡像環(huán)境負(fù)責(zé)對(duì)劣化點(diǎn)優(yōu)化的驗(yàn)證,二者并行工作


    A/B環(huán)境

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,205評(píng)論 3 119
  • 因緣際會(huì)認(rèn)識(shí)了易效能時(shí)間管理課,帶著孩子去人生地不熟的地方上課。一切只是為了讓孩子有時(shí)間的概念,一轉(zhuǎn)眼鑫寶90天踐...
    LANGFANG閱讀 134評(píng)論 0 1
  • 此次戰(zhàn)爭(zhēng)是蕭道成有生以來(lái)遇到的最艱難的戰(zhàn)爭(zhēng),敵人準(zhǔn)備萬(wàn)全、自己臨陣磨槍,雖然他滿口承諾、信心滿滿、勇氣可嘉,但在關(guān)...
    惘然生煙閱讀 604評(píng)論 0 3
  • 經(jīng)常發(fā)現(xiàn)一件事情很重要必須要做,但等到去處理的時(shí)候發(fā)現(xiàn)已經(jīng)過(guò)了時(shí)間,內(nèi)心一萬(wàn)只草泥馬在奔騰 不是因?yàn)椴幌胱龆蝗プ?..
    自由算法閱讀 889評(píng)論 1 1

友情鏈接更多精彩內(nèi)容