国产成人啪精品视频免费网-国产成人啪精品视频免费网站软件-国产成人盗拍精品免费视频-国产成人深夜福利在线观看-a中文字幕1区-a毛片

二維碼
企資網(wǎng)

掃一掃關注

當前位置: 首頁 » 企資快報 » 服務 » 正文

西瓜卡頓 & ANR 優(yōu)化治理及監(jiān)控體

放大字體  縮小字體 發(fā)布日期:2021-08-19 02:01:22    作者:媒體小英    瀏覽次數(shù):38
導讀

背景卡頓 & ANR 在各 APP 中都是非常影響用戶體驗的問題,關于其的分析和治理一直也是個老生常談的話題。過去調(diào)查卡頓 & ANR 問題主要依賴上報的堆棧和 traceInfo 文件,通過這些信息還原問題的現(xiàn)場情況。但是在實踐

背景

卡頓 & ANR 在各 APP 中都是非常影響用戶體驗的問題,關于其的分析和治理一直也是個老生常談的話題。過去調(diào)查卡頓 & ANR 問題主要依賴上報的堆棧和 traceInfo 文件,通過這些信息還原問題的現(xiàn)場情況。但是在實踐過程中發(fā)現(xiàn),現(xiàn)有監(jiān)控機制下堆棧的抓取時機是晚于問題發(fā)生的,大部分情況獲取到的是問題發(fā)生后某一瞬間的堆棧,隨機性強,是不置信的,無法反映問題的真實現(xiàn)場情況,同一個問題可能聚合到不同堆棧中,無法清晰的歸類和定位問題,這就使得很多開發(fā)者清楚原理,但到了具體 case 時無從下手,調(diào)查起來缺乏方向甚至因堆棧聚合的不置信而陷入了錯誤的排查方向,效率低下。另一方面,大多能夠準確衡量性能的工具本身會帶來嚴重耗時問題,無法用于線上,而性能問題大多發(fā)生于復雜的線上用戶場景。所以,如何對卡頓 & ANR 進行有效的防治就是我們需要考慮的問題。

卡頓 & ANR 治理現(xiàn)狀和痛點

過去幾年,在業(yè)務發(fā)展的同時積累了大量的卡頓 & ANR 問題,對用戶的使用體驗帶來了極大的負面影響。隨著治理工作的進行,現(xiàn)有的監(jiān)控機制暴露出一定的問題,堆棧不置信、聚合錯誤、缺乏正確信息、缺乏有效防治策略,這些成了制約治理工作進行的瓶頸。

卡頓 & ANR 現(xiàn)狀

長期以來,新老問題的不斷疊加,同時沒有系統(tǒng)的進行相關防治工作使得數(shù)據(jù)指標常態(tài)高水位,影響的用戶以及發(fā)生次數(shù)都很不樂觀。

在治理之初,卡頓周均影響用戶比例達到 10‰ 左右,受影響的用戶平均 5 次卡頓,ANR 影響用戶則常態(tài)高水位保持在 6‰ 左右,受影響用戶平均 ANR 2 次,這些數(shù)據(jù)在公司的各大 APP 中都排名很差。

對問題進行篩查發(fā)現(xiàn),問題呈現(xiàn)頭部集中,整體分散的現(xiàn)象,TOP 2 問題占總體的 30%,其余問題零零散散的分布在 60000 個不同的堆棧聚合上,觀察這些不同的堆棧聚合,TOP 2 問題落在了系統(tǒng)的堆棧上,同時很多小量級聚合并非直觀上的耗時點,這些現(xiàn)象給我們初期的治理工作帶來了很大的困擾,占比極大的 TOP 問題優(yōu)先級最高,但是如何導致,需要如何優(yōu)化,分散在 60000 個堆棧聚合上的問題應該如何切入。

另外,長期以來缺乏有效的增量問題防治能力。在開發(fā)、測試階段沒有專項測試,問題很少暴露,也缺乏持續(xù)跟進計劃和問題復現(xiàn)定位能力,在灰度、線上等用戶場景下報警策略單一,只有新增堆棧聚合情況下才會觸發(fā)報警,實際運行中發(fā)現(xiàn)報警策略很少觸發(fā),大多情況下也無法消費。

卡頓 & ANR 檢測機制及問題

首先,我們來看一下 TOP 2 問題的堆棧表現(xiàn)。

TOP 2 問題聚合到了 nativePollonce 和 nSyncAndDrawframe 系統(tǒng)堆棧上,占比分別達到了 20% 和 10%,nativePollonce 是主線程消息機制下的消息分發(fā)函數(shù),nSyncAndDrawframe 是頁面的基礎繪制函數(shù),直觀上看沒有問題,對此我們在初期進行了一系列的常規(guī)分析和嘗試。以 TOP 1 的 nativePollonce 為例。首先,常規(guī)懷疑該方法本身耗時,分析了方法在 Java 層和 native 層的執(zhí)行邏輯。

看到在 native 層有 epoll_wait 調(diào)用,通過在 C++ 層 hook 相關方法驗證,沒有發(fā)現(xiàn)問題。接著我們在 Java 層構(gòu)造一個一直存在的 idleTask,使得消息隊列空閑時就執(zhí)行 idle 任務而不休眠,驗證發(fā)現(xiàn)問題仍然存在。再看 Java 層邏輯。

這部分是關于同步屏障的處理,異步更新 UI 可能會導致同步屏障出現(xiàn)多線程問題而無法移除,驗證后排除該可能。調(diào)查至此,并沒有找到該問題的明確原因,排名第二的 nSyncAndDrawframe 的問題與此類似,經(jīng)過埋點調(diào)查,很多 nSyncAndDrawframe 問題下的調(diào)用鏈路并不耗時。

此時,我們回過頭來看一下目前的監(jiān)控機制。對于卡頓 & ANR 的檢測和分析,長期以來我們依賴于 NPTH 工具提供的能力。對于卡頓的監(jiān)控,采用攔截消息調(diào)度流程,在消息執(zhí)行前埋點計時,當耗時超過閾值時,則認為是一次卡頓,會進行堆棧抓取和上報工作。ANR 的監(jiān)控則是通過定時輪詢,在線程中每 500ms 定時和 AMS 進行交互,通過 AMS 的 Error 信息來判斷是否發(fā)生 ANR,當確定發(fā)生 ANR 時,進行堆棧的抓取和信息的上報。

在實際分析解決問題時,以上不論卡頓還是 ANR,在現(xiàn)有檢測機制下獲取到的堆棧及其他信息都存在一定的缺陷,無法有效解決問題。

對于卡頓,由于是以 Message 為維度進行檢測,當檢測到 Message 超時發(fā)生卡頓時,拿到的堆棧是從 Message 開始到當前執(zhí)行 Method 的堆棧鏈路。實際上 Message 中可能執(zhí)行了幾千個 Method,耗時點很可能是 Message 中的另外 Method 或者多個 Method 耗時堆積導致 Message 超時,這一點我們無法確認。因此知道 Message 耗時對我們排查問題幫助很小,我們還是無法定位到具體的可消費的耗時點,這就導致當前的卡頓數(shù)據(jù)無法快速消費。

對于 ANR,抓棧時機是定時輪詢有 ANR 發(fā)生才進行的。一方面從發(fā)生 ANR 到開始抓棧到抓棧完成都有一定的時間間隔,除了少部分循環(huán)等待、鎖等待等卡住場景能夠相對準確抓到,大部分問題抓到堆棧和問題現(xiàn)場不匹配,堆棧會落在耗時點之后的調(diào)用鏈路上。另一方面對于那種多次耗時累積導致 ANR 的情況,單點的堆棧也無法定位問題。

在此基礎上,我們接入了調(diào)度時序圖,調(diào)度時序圖就是主線程 MessageQueue 中的 Message 執(zhí)行情況,包括已執(zhí)行 Message、當前 Message 和待執(zhí)行 Message,可以在 ANR 發(fā)生時一起上報。我們借助調(diào)度時序圖來看 nativePollonce 聚合下的 case:

可以看到,前邊有 Message 耗時 42s,而上報的堆棧當前 Message 耗時很少,ANR 和當前 Message 沒有關系。

這是一個多次耗時累積導致 ANR 的問題,同樣當前 Message 耗時很少。借助調(diào)度時序圖我們可以得出結(jié)論,nativePollonce 這類問題很可能和當前堆棧沒有關系,聚合在 nativePollonce 是因為消息調(diào)度是執(zhí)行頻率最高的函數(shù),抓棧時堆棧落到 nativePollonce 的頻率是最高的,這個堆棧信息對于我們解決問題是無用的,那么是否可以借助調(diào)度時序圖解決問題呢?

很遺憾,也不可以。調(diào)度時序圖展示的是 Message 級的耗時情況,類似卡頓,我們即使知道了哪一個 Message 耗時,但 Message 中執(zhí)行的 Method 非常多,而且很多都是系統(tǒng)級 Message,我們無法定位具體是哪些 Method 耗時。另外,單點的堆棧也無法定位問題,這種情況無論當前 Message 是否耗時都無法定位問題,因為問題的原因和已執(zhí)行的耗時 Message 是息息相關的。

經(jīng)過以上從原理分析和初期的案例調(diào)研,我們確認了基于目前的卡頓和 ANR 機制及工具,無法獲取正確的問題堆棧聚合,對于多次耗時導致的問題更是無從下手,無法有效定位問題和解決問題。

增量問題的防治

在優(yōu)化工作中,新增問題的防治和存量問題的治理同樣重要,只有堵住新增問題,線上的情況才會隨著存量問題解決越來越好。

關于增量問題,之前并無有效的防治手段,僅有的線下測試和灰度/線上新增問題線上報警也收效甚微。線下測試主要是開發(fā)測試階段針對功能的測試以及一系列自動化測試,這些測試并非針對卡頓 & ANR 等性能問題設計,對相關問題敏感度和關注度不夠,同時機型和觸達的場景不足使得暴露出的問題很少,而且缺乏必要的分析能力和分析工具,現(xiàn)場可用信息很少。

而灰度/線上新增問題報警策略,準確率和可消費性都不高。只有出現(xiàn)新的堆棧聚合才會觸發(fā)報警,而通過對現(xiàn)狀的分析可知,除了個別死鎖、循環(huán)等待等 case 外,大部分 case 的堆棧具有很大的隨機性,要么落到 nativePollOnce/nSyncAndDrawframe 等無法消費的系統(tǒng)堆棧,要么分散到各類其他業(yè)務堆棧,分析人員拿到的信息大都是不置信的,這樣很可能發(fā)生這樣的情況:

  • 觸發(fā)報警的堆棧聚合真實原因不是新增
  • 新增問題導致的問題不觸發(fā)報警
  • 問題無法消費

    總之,抓棧隨機性決定了我們無法定位真實原因,也就無法確定新增問題的有效性,這就使得很多新增問題被帶入線上,我們也在這種低效的惡性循環(huán)中不斷重復。

    我們的訴求

    經(jīng)過以上的分析和調(diào)研,我們的痛點可以歸結(jié)為以下三類:

  • 對于單點問題,無法定位到真實堆棧。
  • 對于多點耗時問題,無法還原問題現(xiàn)場。
  • 缺乏有效的增量問題防治手段。

    現(xiàn)有的問題現(xiàn)場堆棧對于由于抓棧的不準確,無論對單點問題排查還是多段耗時問題排查都意義不大,無法正確的還原現(xiàn)場信息,這使得我們的問題排查優(yōu)化進展緩慢,甚至偏離正常的方向。現(xiàn)有的卡頓及調(diào)度時序圖等工具都是以 Message 為統(tǒng)計粒度,無法提供真正可優(yōu)化的耗時定位,而現(xiàn)有的以 Method 為統(tǒng)計粒度的工具由于性能和穩(wěn)定性問題都只能運行在線下。為此,我們希望有一套能夠高效運行在線上的 Method trace 工具,用于卡頓及 ANR 的檢測,以 Method 耗時為統(tǒng)計粒度,獲取卡頓/ANR 時用戶當前和之前一段時間內(nèi)的 Method 執(zhí)行耗時情況,這樣我們可以完整的呈現(xiàn)問題發(fā)生時刻以及之前一段時間的 Method 執(zhí)行耗時情況,高效清晰的定位問題癥結(jié)所在。

    針對增量問題的防治,由于現(xiàn)有的能力無法識別問題是否新增,導致在錯誤的方向上耗費太多精力,而真正的問題無法被發(fā)現(xiàn)從而帶入線上,為此我們需要搭建增量問題的防治體系,去體系化前置化的完成增量問題的監(jiān)控、有效信息的提供、問題的分發(fā),前置化預防才能避免問題被帶入線上,體系化才能更高效更全面的最大限度發(fā)現(xiàn)問題,同時將增量問題的防治體系建設和問題監(jiān)控解決能力建設結(jié)合起來,建立一個自動化、前置化、發(fā)現(xiàn)問題全面、易消費、分發(fā)及時的的全鏈路體系。

    監(jiān)控體系建設

    在目前的監(jiān)控體系下,堆棧抓取不準確,堆棧聚合存在問題,大量聚合在了無意義的堆棧上,現(xiàn)有的工具體系下,分析成本極高,大多數(shù)問題無法得到有效消費,卡頓和 ANR 指標長期高位,這就要求我們盡快找到破解之法。

    誠然,最終導致彈出 ANR 彈窗的誘因很多,但是歸根結(jié)底,根本原因都是執(zhí)行超時,而我們最需要關注的也是那些耗時較高的 Method,當 Method 耗時減少后,相應的觸發(fā) ANR 的幾率也會隨之減少,為此我們就需要找出那些真正耗時卡頓的地方并對其進行優(yōu)化。

    針對以上的痛點和訴求,我們重新梳理了思路,對比了現(xiàn)有方案的優(yōu)缺點后,取長補短,開發(fā)了基于 Method 的高性能線上 trace 工具。在此基礎上,我們針對 ANR、卡頓進行了方案升級和全方位的體系建設。

    基于 Sliver 的 ANR 治理方案介紹

    針對 ANR,我們希望獲取到發(fā)生 ANR 時前一段時間的堆棧記錄,以快速的找出發(fā)生耗時的 Method 調(diào)用堆棧。

    Sliver 采用采樣的方式來定時獲取堆棧,我們在 APP 啟動時打開 Sliver 的監(jiān)控能力,根據(jù)不同機型傳入不同的采樣值,通常在低端機采樣值會大一些,在高端機采樣值會小一些,這樣最大限度降低獲取 trace 本身對性能的影響,Sliver 定時抓取堆棧,并對獲取到的堆棧做 diff 聚合、緩存以區(qū)分不同堆棧的關系。同時,通過 NPTH 的接口注冊 ANR 的回調(diào),當發(fā)生 ANR 時,回調(diào)函數(shù)中將緩存的堆棧 dump 到文件,同時將文件隨 ANR 其他信息上報到 Sladar,這樣我們就可以在對 case 的分析中使用精確的 trace 信息問題定位,下圖說明了針對 ANR 的整體工作流程。

    我們將這一套流程運行起來,收集了相關 case,在同一個 case 拿到相關信息對比。

    以上三個圖是同一個 case 中的不同信息,分別是堆棧、調(diào)度時序圖、trace,通過 trace 能清晰看出問題的原因所在。

    目前該方案已在線下、灰度、眾測渠道常態(tài)開啟,作用明顯,如下:

  • 幫助新增問題的界定、歸因,防止新增問題帶入線上。
  • 幫助存量問題的歸因、定位,梳理清楚各錯誤堆棧聚合中的真正問題原因。
  • 對于線下、眾測等反饋較多渠道單點精準定位解決問題。

    整體上,該方案的上線,使得我們能夠更清晰準確的定位問題原因,加快問題的流轉(zhuǎn)解決,促進各類隱藏較深問題的快速解決。

    卡頓問題的防治方案

    不同于 ANR 問題,卡頓問題的標準是我們自己定義的,卡頓以及多次卡頓的疊加是導致 ANR 以及影響性能的大項,現(xiàn)有的卡頓監(jiān)控只能拿到單一的堆棧鏈路,無法完整還原當前卡頓產(chǎn)生現(xiàn)場全貌,基于此我們設計了基于 Sliver trace 的卡頓監(jiān)控體系。

    先看整體流程圖:

    主要包含兩個方面:

  • 檢測方案

    在監(jiān)控卡頓時,首先需要打開 Sliver 的 trace 記錄能力,Sliver 采樣記錄 trace 執(zhí)行信息,對抓取到的堆棧進行 diff 聚合和緩存。

    同時基于我們的需要設置相應的卡頓閾值,以 Message 的執(zhí)行耗時為衡量。對主線程消息調(diào)度流程進行攔截,在消息開始分發(fā)執(zhí)行時埋點,在消息執(zhí)行結(jié)束時計算消息執(zhí)行耗時,當消息執(zhí)行耗時超過閾值,則認為產(chǎn)生了一次卡頓。

  • 堆棧聚合策略

    當卡頓發(fā)生時,我們需要為此次卡頓準備數(shù)據(jù),這部分工作是在端上子線程中完成的,主要是 dump trace 到文件以及過濾聚合要上報的堆棧。分為以下幾步:

  • 拿到緩存的主線程 trace 信息并 dump 到文件中。
  • 然后從文件中讀取 trace 信息,按照數(shù)據(jù)格式,從最近的方法棧向上追溯,找到當前 Message 包含的全部 trace 信息,并將當前 Message 的完整 trace 寫入到待上傳的 trace 文件中,刪除其余 trace 信息。
  • 遍歷當前 Message trace,按照(Method 執(zhí)行耗時 > Method 耗時閾值 & Method 耗時為該層堆棧中最耗時)為條件過濾出每一層函數(shù)調(diào)用堆棧的最長耗時函數(shù),構(gòu)成最后要上報的堆棧鏈路,這樣特征堆棧中的每一步都是最耗時的,且最底層 Method 為最后的耗時大于閾值的 Method。

    之后,將 trace 文件和堆棧一同上報,這樣的特征堆棧提取策略保證了堆棧聚合的可靠性和準確性,保證了上報到平臺后堆棧的正確合理聚合,同時提供了進一步分析問題的 trace 文件。

    上線后,我們通過和原卡頓體系進行效果對比:

    以上三圖分別是,針對高斯模糊問題的原卡頓列表、現(xiàn)在卡頓列表、trace 。在原先的卡頓上報列表中,問題分散到了不同的堆棧中,這是由于發(fā)生卡頓時抓棧隨機,而現(xiàn)在的卡頓列表聚合到了單一的堆棧鏈路中,這是由于我們?nèi)∶恳粚佣褩V泻臅r最長的函數(shù)組合成特征堆棧,通過trace也可以驗證特征堆棧的有效性,能夠更準確的定位問題原因。同時,trace 詳細的展示了函數(shù)調(diào)用鏈路,提供了深入分析問題的能力。

    經(jīng)過 trace 和堆棧驗證,該方式輸出的卡頓信息,堆棧聚合更加契合真正的卡頓點,當然一個 Message 中可能有多個大大小小的耗時函數(shù)存在,trace 文件的存在能夠更全面的還原現(xiàn)場情況,二者的結(jié)合才能更好的解決問題。

    目前卡頓檢測體系已經(jīng)在眾測及線下自動化常態(tài)運行,產(chǎn)出數(shù)據(jù)來看均為線上存在問題。

    前置發(fā)現(xiàn)能力建設

    基于 Sliver 能力的卡頓和 ANR 檢測方案,能夠極大提高解決問題的效率,接下來我們需要考慮如何將這兩種能力常態(tài)的運行起來,服務于我們的日常存量問題、增量問題的防和治,尤其是將問題的暴露階段提前,減少對用戶的影響尤為重要。為此,我們進行了以下幾個方向的建設。

  • 線下壓力測試

    目前,測試平臺提供了一些自動化測試 job,這些 job 大多以遍歷方式自動的測試 APP 的功能,對所有功能優(yōu)先級一樣的觸達,我們將我們的 ANR 檢測能力和卡頓檢測能力進行集成打包,觸發(fā)自動化 job,產(chǎn)出相關的卡頓和 ANR case。

    分析對比這些 case 后發(fā)現(xiàn),線下上報的 TOP 問題和線上問題差異較大,不符合用戶真實的使用場景。線下檢測出的一些量級較大的 case 在線上場景出現(xiàn)的量級很小,影響的用戶很少,而線上一些影響用戶較多的 case,線下檢測卻上報很少。分析這是由于遍歷式的測試方案不符合真實的用戶行為,這會使我們在推動解決問題中優(yōu)先級錯誤,無法及時正確辨別那些真正量級高、影響用戶多、優(yōu)先級高的問題,影響整體的優(yōu)化節(jié)奏。

    為此,我們接入了更智能的基于用戶行為的測試策略,產(chǎn)出了更符合用戶真實行為的智能測試 job,基于此 job 進行卡頓和 ANR 數(shù)據(jù)收集,采樣分析相關數(shù)據(jù)符合線上數(shù)據(jù)分布,在量級和影響用戶量級分布上更接近真實的用戶場景,得到正確的問題優(yōu)先級。

    同時利用測試平臺接口,我們構(gòu)建了完全自動化的測試機制:基于最新 release 分支定時觸發(fā)打包平臺打包 -> 配置渠道為性能測試專用渠道 -> 成功后執(zhí)行自動化測試生成數(shù)據(jù)。

  • 線上 (beta_version 和灰度)

    線下的自動化測試畢竟受機型、場景等條件限制,不易發(fā)現(xiàn)一些用戶個性化問題。為此,在線上進行問題檢測顯得尤為重要。beta_version 和灰度渠道都是真實的用戶渠道,能夠覆蓋各種場景,但二者又有所不同,beta_version 用戶較少但活躍度更高。為此我們在 beta_version 渠道集成了卡頓和 ANR 數(shù)據(jù)的收集方案。同時,灰度渠道由于用戶數(shù)多,可以提供更全面的場景和用戶,我們也在灰度渠道集成了 ANR 方案,不過由于卡頓發(fā)生的頻率相對較高,考慮到灰度用戶多的特點,我們暫未開啟灰度渠道的卡頓采集。

  • 動態(tài)能力建設

    很多時候需要對線上用戶遇到的問題進行動態(tài)調(diào)查,相關調(diào)查能力雖然完備,但出于包大小的考慮很多時候并不會帶到線上。針對此類問題,需要有一種類似于補丁但又相對輕量的方案,能夠動態(tài)的下發(fā)能力到用戶的手機上。

    為了提高西瓜 Android 客戶端的動態(tài)調(diào)查能力,將所有的通用能力封裝成一個模塊,通過統(tǒng)一的接口進行調(diào)度與事件分發(fā),結(jié)合插件化下發(fā)加載能力,實現(xiàn)精準下發(fā)調(diào)查能力到任意手機上。

    在實現(xiàn)上,整體流程如下圖:

    可以分為宿主、插件、組件三部分來看:

  • 宿主控制器,進行配置的拉取、插件初始化,預埋接口供宿主調(diào)用,根據(jù)調(diào)用及動態(tài)配置反射向插件分發(fā)器傳遞指令。
  • 插件分發(fā)器,接收宿主的指令,并對應的加載不同的組件,執(zhí)行不同的操作。
  • 組件是一個個的獨立模塊,提供能力的具體實現(xiàn),執(zhí)行具體的功能。

    基于此框架,我們可以根據(jù)需求以動態(tài)下發(fā)插件的方式下發(fā)攜帶不同能力的插件包,同時利用 Setting 控制宿主執(zhí)行相應的操作,完成動態(tài)的定向下發(fā)特定能力到特定手機或某類渠道的能力,這有以下優(yōu)點:

  • 工具無需集成到 APK,不影響包大小
  • 動態(tài)能力強,線上可以定向調(diào)查問題,線下可以快速驗證問題。

    目前,我們已將多種問題調(diào)查能力進行了集成,為線上問題調(diào)查和修復提供了支撐。

    卡頓數(shù)據(jù)的消費鏈路建設

    以上部分從線上、線下、動態(tài)能力角度結(jié)合卡頓 & ANR 方案進行了全方位的運行,產(chǎn)出了易消費可消費的數(shù)據(jù),接下來我們需要完善消費流程,提高問題的解決效率。

    針對產(chǎn)出的數(shù)據(jù),我們通過輕服務進行數(shù)據(jù)處理,根據(jù) apm_open 開放接口,我們可以拿到 job 對應的卡頓& ANR 數(shù)據(jù)列表,遍歷列表,將每一個 case 的相關信息進行拼接,尤其是卡頓的 trace 文件鏈接,避免了文件下載鏈路較長的弊端,降低優(yōu)化成本,之后將這些信息分發(fā)到對應的跟進群中。同時,在 Sladar 上根據(jù)對應的代碼修改人或模塊 owner 指定 owner 跟進。效果如下:

    同時,針對需要獲取大量 trace 文件進行分析的場景,我們也開發(fā)了本地工具,便捷批量拉取 trace 文件。

    總的來說,西瓜從基礎工具的開發(fā)到在此之上卡頓 & ANR 方案的優(yōu)化到線上線下動態(tài)前置發(fā)現(xiàn)能力建設再到最終的消費鏈路,完成整個卡頓 & ANR 監(jiān)控體系的閉環(huán),在存量問題解決、增量問題防治、單點問題跟進、整體性能治理上發(fā)揮了重要作用。

    典型案例介紹

    堆棧聚合錯誤案例

    對 TOP 1 的 nativePollonce 問題撈取多個 trace 樣本進行分析,堆棧表現(xiàn)如下:

  • 數(shù)據(jù)庫問題

    通過 trace 看出其實是主線程在執(zhí)行數(shù)據(jù)庫操作,快速推動解決。

  • Dex2oat 問題

    通過 trace 看出其實是 ClassLoader. 執(zhí)行了 20+s,查看源碼,發(fā)現(xiàn)是 PluginClassLoader.->....dex2oat....->Runtime.exec 這樣一個調(diào)用鏈路。

    基于以上的堆棧,我們知道該問題是在加載插件時,驗證 oat 文件不通過而觸發(fā)主線程 dex2oat 操作導致。因此我們提前在插件 Plugin 實例初始化時,判斷 oat 文件是否有效,無效的話中斷插件狀態(tài)機,置為不可用,同時異步重新生成 dex2oat 產(chǎn)物。

  • 直播問題

    通過 trace 清晰看出是直播插件內(nèi)部的初始化耗時嚴重導致問題,而非上報的堆棧分析發(fā)現(xiàn),觸發(fā)主要發(fā)生在插件加載成功的回調(diào)中,基于現(xiàn)在的插件框架,插件的加載主要有兩條路徑:

  • 主動 preload 插件
  • 反射插件類從而被動觸發(fā)插件加載

    為此,我們從兩個方面進行了優(yōu)化:

  • 從宿主層面梳理兩類拉起插件時機,避免過早無意義拉起插件,按需加載
  • 推動業(yè)務方,根本上優(yōu)化初始化耗時。

    非常規(guī)案例

  • Json copy 問題

    有一類這樣的問題,看堆棧發(fā)生在 JSonObject clone = new JSonObject(origin.toString),在其中的浮點類型轉(zhuǎn)換時。

    看到這個堆棧的第一印象是該方法并不耗時,堆棧偏移,然后拿到對應的 trace 可以看到,確實是當前方法非常耗時導致。

    看 trace 的最下層,都是重復的位計算,推測是一個超級長的 double 類型數(shù)字導致的運算過長,在灰度上收集對應的 json 發(fā)現(xiàn)其中無此類數(shù)據(jù),推測是 toString 的時候,會把存放的 double 數(shù)據(jù)轉(zhuǎn)成 string,然后 new 的時候又把 string 轉(zhuǎn)成 double,這兩次轉(zhuǎn)換可能會出現(xiàn)精度問題,造成 double 的值變成了 1.9999999999999999999999 這種很長的數(shù),然后計算耗時很長,導致 ANR。

    為此,將上述 JSonObject clone = new JSonObject(origin.toString) 邏輯修改為遍歷 origin 內(nèi)容復制拷貝,驗證后此問題消失。

  • HashMap 問題

    一類問題看堆棧報在了 HashMap.remove 方法中。

    同樣,看到該堆棧,第一反應是當前方法并不耗時,堆棧偏移導致,然而拿到對應的 trace 后,我們發(fā)現(xiàn)確實是當前方法導致的耗時。

    從 trace 可以明顯看出,確實在 HashMap.remove 中卡了 40+s,結(jié)合 cpu 負載情況看,也并不是得不到調(diào)度導致。

    深入分析,發(fā)現(xiàn)在多線程操作 HashMap 時,若發(fā)生擴容,可能會產(chǎn)生循環(huán)鏈表,進而觸發(fā)死循環(huán),最終采用 ConcurrentHashMap 后解決該問題。參見:https://www.jianshu.com/p/c72af03abba5。

    卡頓案例

  • 動畫問題

    有一類動畫問題,動畫本身是個簡單的閃光動畫,內(nèi)部沒有復雜邏輯,關于其耗時的可信程度存疑,但是借助 trace 圖可以看到:

    確實動畫存在嚴重的耗時情況,清晰的展示耗時點。此時再看原先卡頓監(jiān)控和現(xiàn)在卡頓監(jiān)控的堆棧聚合效果:

    上邊兩圖分別表示了原卡頓監(jiān)控和現(xiàn)在卡頓監(jiān)控的堆棧聚合效果,可以看到原卡頓監(jiān)控的堆棧聚合到了多個不同的堆棧鏈路下,這也是因為其抓棧的隨機性,這樣會使我們分散精力,也無法確定問題真實原因,而在我們現(xiàn)有的卡頓體系下,堆棧高度精確聚合到唯一的堆棧鏈路上,借助 trace 信息,也可以驗證堆棧的準確性。基于此,我們可以精確定位和分析問題。

  • 詳情頁問題

    有一種情況,如果一個 Message 中每一層調(diào)用中的函數(shù)都非常耗時,那么就會有多個聚合,此時的每一個聚合都是一個真實耗時鏈路,對應的 trace 如下:

    可以看到,所有函數(shù)的耗時一目了然,這樣可以清晰明確問題之所在,找準優(yōu)化方向。

    以上案例介紹,展示了我們在卡頓和 ANR 方面調(diào)查能力的提升,大大提升了我們在問題解決及防治上的能力,解決了長期以來制約我們提升性能的瓶頸,為長期的發(fā)展提升提供了支撐。

    卡頓 & ANR 后續(xù)規(guī)劃

    過去一段時間的監(jiān)控建設和治理工作取得了不錯的成果,但是仍然存在許多問題,主要有以下幾類:

  • 卡頓 & ANR 問題很多時候不是獨立的,和手機本身的 IO、內(nèi)存、負載等因素息息相關,目前我們還沒有將手機本身狀態(tài)加入到監(jiān)控體系中。
  • 卡頓 & ANR 問題很多時候是由于子線程的搶占、Binder 等待等原因,目前我們的監(jiān)控能力無法有效覆蓋到。
  • 隨著越來越多的 native 代碼運行在工程中,帶來的影響影響也越來越大,目前我們的監(jiān)控機制只能追溯到 java 層面,對于 native 層的問題鏈路無法有效定位,這一類問題仍然手段不足且低效。
  • 隨著 APP 動態(tài)能力越來越強,各類動態(tài)無感知上線場景增多,相關問題也很難在線下或灰度階段發(fā)現(xiàn),這給我們帶來了新的挑戰(zhàn),一是數(shù)據(jù)敏感度建設,及時發(fā)現(xiàn)問題出現(xiàn),二是線上歸因問題能力建設,歸因到具體什么上線導致,歸因到具體問題場景和原因。

    基于這些仍然存在的問題,接下來,我們考慮做以下幾方面的工作:

  • 完善對手機 IO、內(nèi)存、負載等重要狀態(tài)信息的監(jiān)控和治理工作,檢測高頻、耗時、異常的 IO、內(nèi)存、負載操作,通過對這些基本狀態(tài)的優(yōu)化間接優(yōu)化卡頓和 ANR。
  • 將卡頓監(jiān)控能力和手機 IO、內(nèi)存、負載結(jié)合起來,對問題聚合做 IO、內(nèi)存、負載維度的劃分,理清手機系統(tǒng)狀態(tài)和 Method 自身運行問題。
  • 完善監(jiān)控體系中對于多線程和 Binder 調(diào)用的檢測,嘗試獲取部分線程的 trace 現(xiàn)場用于輔助定位問題,并對 Binder 調(diào)用進行檢測,對高頻同類型 Binder 操作進行提取優(yōu)化。
  • 嘗試對 native 代碼調(diào)用進行檢測,補齊監(jiān)控鏈路無法觸達 native 層的短板,提高問題定位效率和能力。
  • 建設線上數(shù)據(jù)波動檢測能力,加強數(shù)據(jù)波動的敏感度和發(fā)現(xiàn)效率,建設針對動態(tài)上線功能的歸因篩選能力,篩選出數(shù)據(jù)波動一定范圍內(nèi)的動態(tài)上線功能,縮小排查范圍,提高效率。同時結(jié)合我們的動態(tài)框架和工具鏈進行進一步詳細歸因。

    總結(jié)

    在上面我們整體介紹了過去一段時間西瓜 APP 的體系建設和治理工作,全方位的展示了我們的思考和各項短板的建設,并使之成功用于優(yōu)化實踐和常態(tài)問題防治,80% 以上的卡頓和 ANR 問題能夠準確還原現(xiàn)場信息,線上嚴重影響用戶體驗的問題得到了很大程度的緩解,同時有效遏制了新增問題被帶入線上,為西瓜長期常態(tài)性能問題防治提供了參考。

    加入我們

    歡迎加入字節(jié)跳動西瓜視頻客戶端團隊,我們專注于西瓜視頻 App 的開發(fā)和基礎技術建設,在客戶端架構(gòu)、性能、穩(wěn)定性、編譯構(gòu)建、研發(fā)工具等方向都有投入。如果你也想一起攻克技術難題,迎接更大的技術挑戰(zhàn),歡迎加入我們!

    西瓜視頻客戶端團隊正在熱招 Android、iOS 架構(gòu)師和研發(fā)工程師,最 Nice 的工作氛圍和成長機會,各種福利各種機遇,在北京、杭州、上海、廈門四地均有職位,歡迎投遞簡歷!聯(lián)系郵箱:liaojinxing@bytedance.com ;郵件標題:姓名-西瓜-工作年限-工作地點

  •  
    (文/媒體小英)
    免責聲明
    本文僅代表作發(fā)布者:媒體小英個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔相應責任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 频黄 | 999久久久精品视频在线观看 | 亚洲高清一区二区三区四区 | 亚洲欧美一区二区三区在线 | 在线视频99 | 免费一级毛片在播放视频 | 美女国产福利视频 | 波多野结衣在线免费观看视频 | 一 级 黄 色 片生活片 | 亚洲国产日韩欧美一区二区三区 | 国产日韩精品一区二区三区 | 精品欧美激情在线看 | 成人性色生活片免费网 | 人人99| 精品无码三级在线观看视频 | 日韩一区二区三区四区 | 俄罗斯美女在线观看一区 | 三级国产在线 | 免费观看亚洲视频 | 国产精品久久久久久吹潮 | 青青青青爽视频在线播放 | 久久精品久久精品国产大片 | 欧美日韩一区二区三区高清不卡 | a久久99精品久久久久久不 | 国产v在线播放 | 一区二区三区四区五区六区 | 国产黄色一级毛片 | 国产精品久久久久久久久久直 | 国产高清一区二区三区免费视频 | 免费在线观看a级毛片 | 免费男女视频 | 老太婆性杂交毛片 | 成人免费看www网址入口 | 午夜精品同性女女 | 女人张开腿给男人捅 | 天堂资源8中文最新版在线 天堂最新版 | 爱逼综合网 | 国产精品三级手机在线观看 | 在线观看国产一区二三区 | 波多野结衣在线播放 | 91成人在线免费观看 |