<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          有贊移動(dòng)性能監(jiān)控平臺(tái)(二)

          共 3571字,需瀏覽 8分鐘

           ·

          2021-04-09 09:47

          一、前言

          性能和穩(wěn)定性一直是App質(zhì)量體系中最基本和最關(guān)鍵的一環(huán)。 而移動(dòng)端業(yè)務(wù)快速迭代的過(guò)程中,開(kāi)發(fā)同學(xué)對(duì)性能的關(guān)注不足,量變引起質(zhì)變,App的卡頓嚴(yán)重影響商家的日常經(jīng)營(yíng),商家對(duì)性能的吐槽和抱怨越來(lái)越嚴(yán)重。而面對(duì)商家反饋的性能問(wèn)題,由于缺乏現(xiàn)場(chǎng)信息,問(wèn)題的排查既被動(dòng)又困難。我們急需一個(gè)系統(tǒng)化的解決方案,需要有自己的APM(Application Performance Management),可以通過(guò)它來(lái)發(fā)現(xiàn)問(wèn)題,并且能依靠它的數(shù)據(jù)來(lái)指導(dǎo)我們進(jìn)行性能優(yōu)化。

          二、整體設(shè)計(jì)

          統(tǒng)主要分為兩個(gè)部分:

          • 移動(dòng)端上的「性能檢測(cè)」,主要負(fù)責(zé)數(shù)據(jù)的采集。

          • 后端的「數(shù)據(jù)處理」,主要包含數(shù)據(jù)的清洗、解析、存儲(chǔ)、報(bào)警等。

          2.1 性能檢測(cè)
          2.1.1 慢方法&ANR檢測(cè)
          有贊零售的業(yè)務(wù)復(fù)雜度非常高,且由于業(yè)務(wù)場(chǎng)景的特殊性,有大量的復(fù)雜業(yè)務(wù)邏輯處理都是在移動(dòng)端上做的,本地存在大量的DB操作、數(shù)據(jù)同步、復(fù)雜計(jì)算......,此外收銀設(shè)備的配置和性能相比于手機(jī)有很大的差距,這些都對(duì)我們提出了很大的挑戰(zhàn)。卡頓問(wèn)題也是我們面臨的主要難題之一,為了解決這個(gè)問(wèn)題,我們首先要解決方法運(yùn)行效率的問(wèn)題,找出應(yīng)用中執(zhí)行效率不滿(mǎn)足要求的方法,通過(guò)優(yōu)化這些處理邏輯,提高方法運(yùn)行效率,進(jìn)而提升整體的性能。
          總體流程分為四步:
          Step1:編譯期自動(dòng)采集需要性能檢測(cè)的方法。過(guò)濾不需要進(jìn)行檢測(cè)的方法或類(lèi),為每個(gè)方法分配一個(gè)獨(dú)立ID(包括二方庫(kù)及三方庫(kù)的方法),并生成方法ID與方法簽名的映射文件。
          Step2:編譯期對(duì)方法進(jìn)行插樁通過(guò)插樁的方式對(duì)所有需要檢測(cè)的方法進(jìn)行插樁,在每個(gè)函數(shù)的函數(shù)體前后會(huì)自動(dòng)插入i和o方法,入?yún)榉椒↖D,這樣就可以很方便的對(duì)執(zhí)行時(shí)間進(jìn)行檢測(cè)。
          Step3:運(yùn)行期進(jìn)行性能檢測(cè)。比如慢方法和ANR的檢測(cè)是通過(guò)記錄i和o方法的時(shí)間并進(jìn)行存儲(chǔ),會(huì)記錄每個(gè)方法進(jìn)入和離開(kāi)的時(shí)間,當(dāng)執(zhí)行時(shí)間超出我們?cè)O(shè)定的閾值時(shí),會(huì)將方法的信息進(jìn)行上報(bào),方便后面對(duì)數(shù)據(jù)進(jìn)行處理。
          Step4:收集卡頓現(xiàn)場(chǎng)信息。監(jiān)聽(tīng)每一幀的變化,卡頓發(fā)生時(shí),會(huì)有單獨(dú)的線(xiàn)程去收集堆棧信息以及現(xiàn)場(chǎng)環(huán)境信息(包含:設(shè)備信息、CPU使用情況、內(nèi)存、磁盤(pán)信息等)。
          2.1.2 線(xiàn)程池檢測(cè)
          在Android開(kāi)發(fā)中我們通常會(huì)將一些耗時(shí)任務(wù)放到子線(xiàn)程中進(jìn)行操作,否則可能會(huì)阻塞UI線(xiàn)程,引起ANR、卡頓等問(wèn)題。而我們的App中就存在大量的異步任務(wù),包括網(wǎng)絡(luò)請(qǐng)求、本地大量的DB操作、定時(shí)輪詢(xún)等任務(wù),而所有的這些異步任務(wù)都在同一個(gè)線(xiàn)程池中運(yùn)行(IO線(xiàn)程池),這樣就帶來(lái)了一個(gè)問(wèn)題:當(dāng)網(wǎng)絡(luò)請(qǐng)求比較慢的時(shí)候,線(xiàn)程池會(huì)快速堆積任務(wù),再加上不斷輪詢(xún)的任務(wù),線(xiàn)程池極易被打滿(mǎn),本地快速的一些異常任務(wù)就容易被阻塞住,造成耗時(shí)短的任務(wù)等待耗時(shí)長(zhǎng)的任務(wù)。
          為了解決這個(gè)問(wèn)題,我們需要對(duì)線(xiàn)程池進(jìn)行更細(xì)粒度的劃分,考慮到我們應(yīng)用的特性,我們對(duì)主線(xiàn)程池的定位改為:為大量、快速的本地任務(wù)提供支持,這樣我們就需要將一些「耗時(shí)長(zhǎng)」、「頻率高」的任務(wù)進(jìn)行治理,將這些任務(wù)分離出我們的主線(xiàn)程池,我們需要監(jiān)控線(xiàn)程池中的任務(wù),能通過(guò)監(jiān)控的數(shù)據(jù)挖掘異步任務(wù)的優(yōu)化點(diǎn),同時(shí)為線(xiàn)程池的配置調(diào)整提供可度量的指標(biāo)。
          檢測(cè)的核心在于監(jiān)聽(tīng)線(xiàn)程池的三個(gè)節(jié)點(diǎn):
          • 任務(wù)提交到線(xiàn)程池。拉取每個(gè)任務(wù)的調(diào)用棧信息,解析并記錄任務(wù)的發(fā)起點(diǎn)以及任務(wù)的提交時(shí)間。同時(shí)可以分析此時(shí)線(xiàn)程池的負(fù)載狀況(結(jié)合activeCount、corePoolSize、queueSize),如果負(fù)載達(dá)到閾值,則拉取出當(dāng)前所有的任務(wù),分析是否存在明顯有問(wèn)題的任務(wù)(比如同一任務(wù)發(fā)起多次等)。

          • 任務(wù)開(kāi)始執(zhí)行。記錄任務(wù)開(kāi)始執(zhí)行的時(shí)間。

          • 任務(wù)執(zhí)行完成。與任務(wù)開(kāi)始時(shí)間做差值,計(jì)算并記錄任務(wù)的執(zhí)行時(shí)間,如果任務(wù)的執(zhí)行時(shí)間超出閾值,則會(huì)進(jìn)行上報(bào)。

          總體流程如下:
          通過(guò)上面的方式能逐步分離出「耗時(shí)長(zhǎng)」、「頻率高」的任務(wù),通過(guò)對(duì)這些任務(wù)的優(yōu)化,最終達(dá)到線(xiàn)程池優(yōu)化的目標(biāo)。另外由于有了完整的線(xiàn)程池負(fù)載情況跟蹤以及任務(wù)執(zhí)行時(shí)間數(shù)據(jù),我們對(duì)線(xiàn)程池的健康度也有了可度量的指標(biāo),這也為我們做線(xiàn)程池的自動(dòng)化配置提供了參考依據(jù)。
          2.2 數(shù)據(jù)處理
          2.2.1 整體流程
          (1)方法映射文件記錄。應(yīng)用打包時(shí)會(huì)自動(dòng)執(zhí)行上面的編譯期處理流程,生成方法映射文件,并上傳到APM Server,然后進(jìn)行方法映射數(shù)據(jù)的處理。
          (2)性能數(shù)據(jù)同步??D發(fā)生時(shí),會(huì)上報(bào)相關(guān)數(shù)據(jù)。數(shù)據(jù)會(huì)通過(guò)DP(數(shù)據(jù)平臺(tái))進(jìn)行清洗、計(jì)算和統(tǒng)計(jì)(比如前一天性能報(bào)告統(tǒng)計(jì)),然后通過(guò)Hive -> DB流程同步到后端應(yīng)用的DB中。
          (3)數(shù)據(jù)解析。后端應(yīng)用會(huì)對(duì)數(shù)據(jù)中的卡頓堆棧進(jìn)行解析(把ID解析成方法名)。
          (4)數(shù)據(jù)聚合。解析完后需要對(duì)同一方法的數(shù)據(jù)進(jìn)行聚合(包含跨版本、跨補(bǔ)丁的數(shù)據(jù)處理,比如A方法可能在1.0版本ID是11,在1.0補(bǔ)丁1版本的ID是22,在1.1版本的ID是33,需要把他們聚合成一條數(shù)據(jù)),這樣就能準(zhǔn)確的知道每個(gè)方法的嚴(yán)重程度,每條聚合數(shù)據(jù)也會(huì)記錄對(duì)應(yīng)的解決狀態(tài)。
          (5)數(shù)據(jù)分析&報(bào)警。會(huì)結(jié)合數(shù)據(jù)平臺(tái)上計(jì)算和統(tǒng)計(jì)的結(jié)果以及數(shù)據(jù)聚合后產(chǎn)生的數(shù)據(jù),產(chǎn)出日?qǐng)?bào)、周報(bào)、告警等信息,為性能變化趨勢(shì)提供數(shù)據(jù)化支撐。
          通過(guò)上面的方式將同一個(gè)方法的問(wèn)題進(jìn)行聚合,可以跟蹤所有問(wèn)題的解決狀態(tài),并能通過(guò)數(shù)據(jù)分析進(jìn)行性能變化趨勢(shì)的監(jiān)控以及問(wèn)題的報(bào)警。
          2.2.2 關(guān)鍵節(jié)點(diǎn)
          (1)數(shù)據(jù)解析&聚合
          由于上傳的卡頓信息中只會(huì)包含方法的ID,我們需要在后端對(duì)這些數(shù)據(jù)進(jìn)行解析,將它解析成具體的方法名,然而由于不同版本、不同補(bǔ)丁生成的方法映射文件是不一樣的,同一個(gè)方法在不同的版本對(duì)應(yīng)的方法ID是不一樣的,而我們需要將同一個(gè)方法引發(fā)的問(wèn)題進(jìn)行聚合,這樣才能有效的跟蹤每個(gè)問(wèn)題的解決狀態(tài)。而是否是同一個(gè)方法的認(rèn)定標(biāo)準(zhǔn)為:完整類(lèi)名+方法名,這樣就能幫助方法的唯一性。
          整體解析&聚合流程如下:
          (2)數(shù)據(jù)清理流程
          整個(gè)監(jiān)控平臺(tái)數(shù)據(jù)雖然經(jīng)過(guò)重重過(guò)濾,但是本身的數(shù)據(jù)量還是非常大的,任由數(shù)據(jù)無(wú)節(jié)制的增長(zhǎng)會(huì)很容易到達(dá)我們處理的瓶頸,且這龐大數(shù)據(jù)中大部分是無(wú)需長(zhǎng)時(shí)間存儲(chǔ)的,我們需要有數(shù)據(jù)的清理機(jī)制,通過(guò)清理機(jī)制來(lái)保證我們數(shù)據(jù)不至于增長(zhǎng)過(guò)快:
          • 未分配的問(wèn)題且最近一個(gè)月問(wèn)題不再出現(xiàn),則這個(gè)問(wèn)題大概率以后不會(huì)再發(fā)生了,針對(duì)這種問(wèn)題我們會(huì)直接清除問(wèn)題的所有信息,不會(huì)再跟蹤這個(gè)問(wèn)題。

          • 已分配但未標(biāo)記解決的問(wèn)題且最近一個(gè)月問(wèn)題不再出現(xiàn),這種問(wèn)題一般是問(wèn)題已經(jīng)修復(fù)但是沒(méi)有及時(shí)修改狀態(tài),我們會(huì)把問(wèn)題的狀態(tài)修改為自動(dòng)失效。

          • 狀態(tài)流轉(zhuǎn)已結(jié)束的問(wèn)題(包括已處理、已忽略、自動(dòng)失效的問(wèn)題),我們會(huì)保留最新的一條明細(xì)數(shù)據(jù)進(jìn)行存檔,剩余的明細(xì)數(shù)據(jù)會(huì)全部清除。

          • 方法映射表中會(huì)存儲(chǔ)過(guò)往所有版本的所有方法信息,然而其中絕大多數(shù)方法其實(shí)是沒(méi)問(wèn)題的(比如簡(jiǎn)單的a+b),所以這里我們會(huì)對(duì)最近一個(gè)月解析時(shí)沒(méi)有訪(fǎng)問(wèn)的方法進(jìn)行清除(解析時(shí)沒(méi)訪(fǎng)問(wèn)的方法意味著這個(gè)方法沒(méi)發(fā)生卡頓問(wèn)題)。

          • 同一個(gè)版本可能會(huì)上傳多次方法映射表信息,而真正發(fā)布的只會(huì)有一個(gè),因此我們會(huì)去發(fā)版平臺(tái)獲取某個(gè)版本正在發(fā)布的信息,然后把沒(méi)有正常發(fā)布的方法映射表數(shù)據(jù)刪除。

          整體清理流程如下:
          三、功能介紹
          3.1 問(wèn)題數(shù)據(jù)
          3.1.1 TOP 問(wèn)題列表
          3.1.2 問(wèn)題詳情
          3.2 問(wèn)題報(bào)警
          3.3 性能報(bào)表
          3.3.1 ANR變化趨勢(shì)
          3.3.2 慢方法變化趨勢(shì)
          3.3.3 FPS變化趨勢(shì)
           3.3.4 線(xiàn)程池卡頓次數(shù)
          四、未來(lái)規(guī)劃
          • 完善性能監(jiān)控體系,補(bǔ)足網(wǎng)絡(luò)、I/O、線(xiàn)程池、磁盤(pán)等方面的監(jiān)控,通過(guò)性能監(jiān)控的數(shù)據(jù)指導(dǎo)性能優(yōu)化。

          • 更多維度的數(shù)據(jù)篩選和過(guò)濾能力,能夠更好的對(duì)指定設(shè)備或門(mén)店進(jìn)行問(wèn)題跟蹤。

          • 更強(qiáng)的數(shù)據(jù)處理能力,能夠更快速地處理更龐大的數(shù)據(jù)量。

          • 完善系統(tǒng)使用體驗(yàn),如:報(bào)表呈現(xiàn)、問(wèn)題分配機(jī)制、問(wèn)題報(bào)警等。

          • 推廣到公司其它的業(yè)務(wù)線(xiàn),幫助解決端上性能監(jiān)控問(wèn)題。

          五、結(jié)語(yǔ)
          通過(guò)性能監(jiān)控的實(shí)踐以及后續(xù)的性能優(yōu)化,幫助我們更好的解決了性能問(wèn)題,總結(jié)下來(lái)它的核心價(jià)值在于:
          • 對(duì)App線(xiàn)上真實(shí)的性能情況有了數(shù)據(jù)化的指標(biāo),讓我們對(duì)性能問(wèn)題有了更清晰的感受。

          • 通過(guò)監(jiān)控的數(shù)據(jù)指導(dǎo)我們進(jìn)行性能優(yōu)化,優(yōu)化效果也能有數(shù)據(jù)化的支撐。

          • 通過(guò)監(jiān)控的數(shù)據(jù)能讓我們更快速的發(fā)現(xiàn)新引入的性能問(wèn)題,防止性能不斷劣化,為App的穩(wěn)定運(yùn)行提供保障。

          • 推動(dòng)各業(yè)務(wù)團(tuán)隊(duì)進(jìn)行性能優(yōu)化,讓大家能更加重視自己產(chǎn)品的性能問(wèn)題。

          性能監(jiān)控與性能優(yōu)化道阻且長(zhǎng),我們也會(huì)不斷地在這方面進(jìn)行更多的嘗試和努力,為App的穩(wěn)定運(yùn)行提供更好的保障,做好性能和穩(wěn)定性的守門(mén)員。

          end


          ?
          ??
          ?
          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草成人在线免费观看 | AV天堂偷拍亂伦 | XXX久久久久监听 | 亚洲中文另类 | 国产一区|