巧用 “火焰圖” 快速分析鏈路性能

本文旨在幫助讀者了解什么是全鏈路追蹤以及如何使用工具來分析鏈路中性能瓶頸。

??火焰圖是什么?

火焰圖(Flame Graph)是由?Linux?性能優(yōu)化大師?Brendan Gregg?發(fā)明的用于分析性能瓶頸的可視化圖表,它以一個全局的視野來看待時間分布,從頂部往底部列出所有可能導(dǎo)致性能瓶頸?Span。

下面以觀測云的火焰圖為例,陳述其繪制邏輯:

縱軸(Y軸)代表調(diào)用?Span?的層級深度,用于表示程序執(zhí)行片段之間的調(diào)用關(guān)系。上面的?Span?是下面?Span?的父?Span。(數(shù)據(jù)上,可以通過子 Span 的?parent_id?等于父?Span?的?span_id?關(guān)聯(lián)起來)

橫軸(X軸)代表單個?Trace?下?Span?的持續(xù)時間。一個格子的寬度越大,說明該 Span 從開始到結(jié)束的持續(xù)時間越長。只要有“平頂”,則表示該函數(shù)可能存在性能問題,就可能是造成性能瓶頸的原因。

????為什么要用火焰圖

通常,我們可以通過查詢?nèi)罩?、使用Shell等協(xié)助定位問題異常原因;再細致一點,會用到Jmap、Jstack分析堆棧跟蹤等。但若需要分析至堆棧、調(diào)用鏈的階段,說明很可能已經(jīng)是Performance的問題了。但上述方法,或將產(chǎn)生海量文本無法直觀分析,或缺乏匯聚型數(shù)據(jù)難以綜合評判,降低了我們排查問題的效率。

因此,為了降低人工二次分析難度、提高性能數(shù)據(jù)的易懂性,火焰圖便被廣泛用于分析性能瓶頸問題。它納入了線程棧的調(diào)用鏈和出現(xiàn)頻率兩個維度,從而可以非常方便地看到頂層的哪個函數(shù)占據(jù)的寬度最大,即性能資源都消耗在了哪里;進而,能夠直觀地定位程序的性能瓶頸,以進行相應(yīng)地優(yōu)化。

觀測云的火焰圖除了展示函數(shù)調(diào)用的基本性能信息之外,還在同一個可視化圖表中關(guān)聯(lián)了多維度數(shù)據(jù),便于用戶綜合評判性能瓶頸的原因所在;同時,充滿細節(jié)與溫度的人性化交互設(shè)計,提升了使用體驗及工作效率

??????如何巧用觀測云火焰圖分析鏈路性能?

3.1?火焰圖

火焰圖左側(cè)圖示區(qū):

同一種顏色的?Span?對應(yīng)同一個服務(wù):可直觀感知當(dāng)前?Trace?所涉及到哪些服務(wù)請求。(小提示:服務(wù)的顏色會繼承到鏈路查看器等其他分析頁面)

每一個Span?塊默認顯示:當(dāng)前?Span?的資源或操作、持續(xù)時間、以及是否存在錯誤;懸浮還可展示其整體耗時占比。

對于多線程或者異步任務(wù):同層級或下屬子Span執(zhí)行時間可能會出現(xiàn)重疊,圖中通過連線的形式來關(guān)聯(lián)父子?Span?之間的關(guān)系。

右側(cè)服務(wù)列表:

顯示當(dāng)前?Trace?內(nèi)發(fā)生請求調(diào)用,所涉及到的服務(wù)名稱和顏色、該服務(wù)執(zhí)行時間占總執(zhí)行時間的百分比。(注意:服務(wù)名稱顯示為?None?的情況,則表示當(dāng)前?trace?未找到?parent_id = 0?的頂層?Span)

3.2 ?Span?列表

上圖全收起狀態(tài),以服務(wù)視角

顯示服務(wù)類型、名稱和顏色,以及當(dāng)前服務(wù)下是否存在?status = error?的?Span;還依次顯示當(dāng)前服務(wù)下面的?Span?數(shù)量、持續(xù)時間的平均值、執(zhí)行時間總和,以及當(dāng)前服務(wù)的執(zhí)行時間占總執(zhí)行時間的百分比。

下圖服務(wù)行展開狀態(tài),以?Span?視角

顯示資源名稱、對應(yīng)服務(wù)顏色及當(dāng)前?span?是否存在?status = error?;還依次顯示當(dāng)前?Span?持續(xù)時間、執(zhí)行時間數(shù)值及占總執(zhí)行時間的百分比。

3.3?服務(wù)調(diào)用關(guān)系

觀測云還可以顯示當(dāng)前?Trace?下服務(wù)之間的調(diào)用關(guān)系拓撲:

支持按資源名稱模糊匹配,定位某個資源的上下游服務(wù)調(diào)用關(guān)系。

服務(wù)?hover?后,顯示當(dāng)前服務(wù)下的?Span?數(shù)量、服務(wù)執(zhí)行時間及占比。

????????如何開啟觀測云通過火焰圖分析鏈路性能?

4.1?注冊與安裝

建議通過電腦端,進入【 觀測云 】(https://console.guance.com)平臺進行實操,并參考觀測云學(xué)堂【 巧用“火焰圖”快速分析鏈路性能 】(https://www.guance.com/learning/articles/flame_graph01)?的操作指引。

4.2?實際鏈路數(shù)據(jù)分析舉例

第一步登錄觀測云工作空間,查看應(yīng)用性能監(jiān)測模塊的服務(wù)列表,從服務(wù)頁面已經(jīng)可以看出?browser服務(wù)的?P90?響應(yīng)時間較長。

第二步點擊?browser服務(wù)名稱,查看該服務(wù)的概覽分析視圖,可以看出影響當(dāng)前服務(wù)響應(yīng)時間的最關(guān)鍵的資源是?query_data這個接口,因為這個接口是觀測云的一個數(shù)據(jù)查詢接口,所以接下來我們看下這個接口在查詢過程當(dāng)中,到底是因為什么導(dǎo)致耗時較長。

第三步點擊資源名稱,跳轉(zhuǎn)到查看器,通過點擊?持續(xù)時間?倒序查看響應(yīng)時間的最大值。

第四步點擊?Span?數(shù)據(jù),查看分析當(dāng)前?Span?在整個鏈路里面的執(zhí)行性能和其他相關(guān)信息。

第五步點擊右上角?[全屏]?模式按鈕,放大查看火焰圖相關(guān)信息。

結(jié)合整體鏈路查看,可以看出?browser服務(wù)在整個鏈路中的執(zhí)行時間占比高達?96.26%,從?Span?列表也可以得出此結(jié)論。

根據(jù)火焰圖的占比和對應(yīng)的鏈路詳情信息,我們可以總和得出?browser的這個?query_data Span在整個執(zhí)行過程中可以看到?resource_ttfb(資源加載請求響應(yīng)時間)耗時?400?多毫秒,?resource_first_byte(資源加載首包時間)耗時?1.46?秒。

再結(jié)合查看?province的地理位置定位是?Singapore(新加坡),而我們的站點部署在杭州節(jié)點,則可以得出是因為地理位置問題導(dǎo)致數(shù)據(jù)傳輸?shù)臅r間變長從而影響了整個的耗時。


相關(guān)閱讀

【 The Flame Graph --Brendan Gregg 】(https://queue.acm.org/detail.cfm?id=2927301)

【 如何讀懂火焰圖?--阮一峰的網(wǎng)絡(luò)日志 】(https://www.ruanyifeng.com/blog/2017/09/flame-graph.html)

【 關(guān)于 Traces 、Span 等鏈路相關(guān)概念的介紹 --OpenTracing 】(https://wu-sheng.gitbooks.io/opentracing-io/content/pages/spec.html)

【 巧用“火焰圖”快速分析鏈路性能 】(https://www.guance.com/learning/articles/flame_graph01)

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

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

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