如何使用 SVG 火焰圖可視化應用程序的性能

已發表: 2023-02-21

SVG火焰圖是可視化應用程序性能的好方法。 通過顯示在每個函數中花費的時間,您可以快速識別代碼中佔用過多時間的區域。 要顯示 SVG 火焰圖,您需要使用可以生成 SVG 火焰圖的工具。 有許多可用的開源工具,例如 flamegraph.io。 生成火焰圖後,您可以使用標籤將其嵌入到您的網站或博客中。 您還可以使用 Google 表格等工具來顯示您的火焰圖。 只需創建一個新的電子表格,選擇“插入 > 圖像”,然後粘貼火焰圖的 URL。

如何運行火焰圖?

如何運行火焰圖?
圖片來源:badawi.io

為了運行火焰圖,您需要在計算機上安裝一些東西。 您首先需要的是 Google Chrome 瀏覽器。 接下來,您需要安裝 Flame Graph 擴展。 安裝完這兩個東西後,您需要打開 Google Chrome 瀏覽器並轉到Flame Graph 擴展頁面。 從那裡,您需要單擊“創建新的火焰圖”按鈕。 這將打開一個新選項卡,您需要在其中輸入要為其創建火焰圖的網站的 URL。 輸入 URL 後,您需要單擊“創建火焰圖”按鈕。 這將需要一些時間來創建火焰圖。 完成後,您將能夠看到結果。

火焰圖顯示分佈式請求跟踪和請求執行期間發生的每個服務調用的摘要。 分佈式跟踪的火焰圖顯示延遲和錯誤數據,以幫助開發人員識別其應用程序中的瓶頸。 文章提供瞭如何解釋火焰圖的解釋以及示例,以及用於跟踪分佈式跟踪的其他方法。 Y 軸顯示調用堆棧的深度(調用次數)。 當您單擊火焰圖上的跨度時,您通常會看到與調用相關的持續時間和錯誤的摘要。 您可以通過單擊火焰圖下方的選項卡來查找指標、日誌、網絡性能數據、代碼熱點和其他上下文信息。 螺旋圖是由一組環包圍的圓形成的。 火焰圖可用於可視化用於滿足代碼分析器請求的方法和代碼路徑。 Datadog 應用程序性能監控和分佈跟踪工具使您能夠跟踪跨所有服務的所有請求的路徑。

火焰圖為開發人員提供了一種快速、簡單的方法來查看性能問題

開發人員可以使用火焰圖在幾秒鐘內可視化分佈式應用程序的性能。 火焰圖可以通過提供請求跟踪的圖形表示並突出顯示應用程序遇到問題的位置來幫助開發人員識別和糾正性能問題。

你如何在 Flamegraph 上搜索?

您可以通過幾種不同的方式在火焰圖上進行搜索。 一種方法是使用位於屏幕右上角的搜索框。 此搜索框允許您輸入關鍵字,然後將用於搜索火焰圖。 另一種在 flamegraph 上搜索的方法是使用瀏覽功能。 該功能位於屏幕左側。 此功能允許您瀏覽不同類別的火焰圖。

隨著火焰圖的出現,現在更容易搜索它們。 在右側的大 TCP_send() 框架下有一個寫入代碼路徑。 如果您單擊其中一個突出顯示的幀,您可以看到為什麼會發生這種情況。 Tcp_Send 存在於 59.1% 的測試樣本中。 其他需要查找的有趣術語包括 re?cv、spin、copy 和 x。

為什麼稱為火焰圖?

在創建可視化時,Neelakanth 和 Roch 使用了完全隨機的顏色。 CPU 很熱(忙),這解釋了為什麼我首先只選擇暖色。 因為它類似於火焰,所以火焰圖很快流行起來。

火焰的危險

火熱的事件是一種釋放挫敗感並開始熱烈討論的有趣方式。 它們還可能導致人際關係破裂並導致人們分崩離析。
對付火焰最好的方法就是忽視它們。 有人可能會張貼火焰; 你應該是那個忽略它的人。 沒有必要回應。 不值得消耗能量。
火焰可能是一種有趣的交流方式,但如果使用不當,在某些情況下也可能有害。 您不必害怕火焰; 相反,您應該避開它們並保持冷靜。

誰發明了火焰圖?

火焰圖已經成為許多語言以及 Netflix 和其他行業進行性能分析的重要工具。 他們的作者 Brendan Gregg 創建了火焰圖,該圖發表在 2016 年 6 月的 ACM Communications 上。


火焰圖查看器

火焰圖查看器是一種允許用戶以圖形形式可視化數據的軟件。 該軟件通常用於解決計算機或其他設備的問題。

您可以使用 speedscope 以基於網絡的方式查看大型性能配置文件。 Brendan Gregg 的 FlameGraphs 的靈感來自 Chrome 開發人員工具的性能面板。 來自系統的數據不會傳遞到任何服務器,它完全在瀏覽器中運行。 Chrome 和 Firefox 應該適用於所有平台(儘管我只測試過 Mac)。 在左重視圖中,相同的堆棧被組合在一起,無論它們是否已被順序記錄。 每個父代的堆棧都經過排序,使其最重的堆棧位於左側——因此是左手標籤。 情況的詳細視圖將幫助您了解在給定情況下您有多少函數調用。

Rudro Samanta 一直在使用 speedscope 可視化使用 Xcode 捕獲的 iOS 應用程序配置文件。 Jest 用於編寫測試用例,Travis CI 用於持續集成代碼,Coveralls 用於測試覆蓋率報告,Parcel 用於轉換源碼,prettier 用於自動格式化代碼。 實現這一目標的一種方法是增加 speedscope 可以導入的格式數量,以及一種使集成更緊密的方法。 我已經在 speedscope 上工作了九個月,我覺得我已經讓它離我而去。 作為一名工程師,我將努力創建可維護、可理解和有用的系統和工具集,以幫助人們解決世界各地的複雜問題。 我相信今年我會投入更多時間在創意和協作項目上。

在線火焰圖

火焰圖是分析數據的圖形表示,通常用於顯示軟件程序的性能特徵。 每個部分的高度表示在該特定代碼部分中花費的時間量。 這些部分根據它們被調用的時間從左到右排序。

與樹和圖不同,火焰圖通過以小格式呈現大量信息來有效地利用屏幕空間。 單擊此處,您將了解如何將樹轉換為火焰圖,以及火焰圖的主要特徵有哪些。 火焰圖在 Google Cloud Profiler 中用於顯示分​​析數據。 當您跟踪調用堆棧時,幀的寬度會減小,因為被調用者的總 CPU 時間不能超過另一個被調用者的 CPU 時間。 火焰形狀是由這種行為引起的。 在使用 CPU 自身時間去除多餘的空白和著色幀後,火焰圖現在顯示如下。 儘管 foo1 和 foo2 的調用堆棧已被保留,但以 foo2 開始並以 foo1 結束的堆棧現在位於幀旁邊。

如何製作火焰圖?

要生成火焰圖,您必須首先對堆棧跟踪進行採樣。 它傳統上被分為兩種類型:系統配置文件,例如 Linux perf,它顯示系統代碼路徑(例如,JVM GC、系統調用、TCP),而不是 Java 配置文件。 可以使用 JVM 分析器,例如 hprof、lJP 和商業分析器。

火焰圖與火焰圖

火焰圖和火焰圖之間存在一些關鍵差異。 火焰圖通常顯示事件的時間線,而火焰圖顯示堆棧跟踪。 火焰圖通常用於調試性能問題,而火焰圖更常用於可視化性能數據。 火焰圖是查看程序如何花費時間的好方法。 它們可以向您展示瓶頸在哪裡,以及程序如何使用資源。 火焰圖是查看程序如何使用資源的好方法。

作為一種用於確定哪些代碼路徑是熱的(因為它們在 CPU 上很忙)的粗略但有用的技術,以固定速率進行分析會產生良好的結果。 火焰圖允許您通過對堆棧跟踪進行採樣來快速識別熱代碼路徑。 我的 Linux perf (perf_events) 和 DTrace 示例都是您可以安裝的軟件示例。 FlameGraph 是一種 Perl 工具,可生成交互式 SVG,並允許您通過在圖像上拖放來查看詳細信息。 可視化可能看起來與探查器中的其他可視化類似,但在某些方面與它們不同。 因為這最初用於可視化 CPU 上的熱點,所以它被稱為火焰圖。 查看 eBPF profile(8) 部分,了解在較新的 Linux 內核中運行的開銷較低的方法(不推薦使用 eBPF profile(8))。

有關 perf 的更多信息,請參閱我的 perf_events 頁面的火焰圖部分。 可以通過包含折疊模式直接從 Linux 4.5 perf 報告輸出折疊輸出,這只能通過使用 stackcollapse-perf.pl 訪問。 此樣本以 99 赫茲 (-F 99) 提供由用戶和內核堆棧 (-f) 分隔的內核 (-a) 和用戶 (-d) 的 lint,樣本的時間限制為 60 秒。 可以使用 Fedora 16 中的 SystemTap v1.7 生成火焰圖。計時器也可以用於對堆棧跟踪進行採樣。 此配置文件探測以系統時鐘速率 (CONFIG_HZ) 運行。 SystemTap 可以使用其 systemTap 聚合功能在內核中進行聚合,並將(不太詳細的)報告傳遞給用戶。

這些圖表是在 Fedora 16 客戶機(具有一個虛擬 CPU)上使用 KVM(Ubuntu 主機)(32 位)生成的。 在裸機上,一些代碼路徑和样本比例會有很大不同。 可以單擊分析數據中的元素以查看百分比(但不能單擊縮放,因為這是新版本),但不能放大。該圖是了解更多 Linux 內部結構的絕佳工具。 在 illumos 內核管理程序主機上,在此示例中可以看到用戶和內核堆棧。 獨立的 SVG 和 PNG 版本也可用。 為了觀察內核時間是如何分配給創建短生命週期的進程的,我對這個火焰圖進行了一個工作負載。

火焰圖通常用於通過顯示頭髮來識別內核中斷負載。 Ubuntu release 1716 中的 NUMA Balancing 消耗了一半以上的 CPU 週期來平衡節點之間的內存,導致性能低下。 在 D3 中重寫火焰圖對於保持合併順序不變而不必重新生成火焰圖是必不可少的。 在我的 JavaOne 2016 演講中,使用火焰圖在 Linux 上進行 Java 性能分析,我介紹了使用 Linux perf 生成混合模式火焰圖的最新技術。 JDK8u60 包含一個名為 /PreservePointerFrame 的功能,它允許您生成性能圖和火焰圖。 JDK-8068945 已作為堆棧分析(幀指針)的熱補丁添加到 JDK 庫中。 在 x64 的編譯代碼中使用 RBP 寄存器作為幀指針時,它被認為是正確的幀指針。

當作為 Jstack 方法運行 DTrace 時,它可以跟踪用戶級堆棧以及 Java 方法和類。 對於Java程序,Stackcollapse.pl和flamegraph.pl用於生成CPU火焰圖。 一些 JVM 版本不支持 ustack helper,這有很多問題。 它適用於任何堆棧跟踪加值組合,而不僅僅是具有 CPU 計數的堆棧跟踪。 第一個問題是由於錯誤 JDK-6260864,Jstack() 可能無法正確遍歷堆棧,該錯誤於 2005 年提交,截至 2014 年仍未修復。此錯誤導致我的生產工作負載中的大多數示例堆棧休息。 您可以深入了解設備的內存分配、設備 IO、系統調用模式、CPU 外事件和特定函數調用。 如果使用其中任何一個,則可以獲得具有相關值的堆棧跟踪:計數、字節或延遲。 火焰圖也可以在火焰圖頁面上查看。

火焰圖 Java

火焰圖是一種數據可視化,用於表示軟件程序的性能。 它是一個圖表,顯示程序在每個功能上花費的時間。 條形的高度表示程序在該函數中花費的時間量。 條形的寬度表示程序相對於其他函數在該函數中花費的時間量。

火焰圖最近成為一種在 Java 中可視化 CPU 使用率的流行新方法。 它們可以使用 Google 的輕量級 Java 分析器 (code.google.com) 和我的火焰圖軟件 (github) 創建。 值得慶幸的是,未來火焰圖不再是 Java 分析器的獨立功能。 在這篇博文中,我們將研究一種僅基於 Java 的基於 JVMTI 的方法,該方法雖然有效,但有一些局限性。 Jeremy Manson 創建了一個輕量級 Java 分析器,可用於對 CPU 進行採樣。 此示例報告在 java 啟動直至退出時生成,並附加了一個 trace.txt 文件。 要運行該程序,需要支付一些費用。

對於我的程序來說,它很小(請求率僅增加 1%,CPU 消耗增加 7%)。 如果應降低採樣率,請參閱後續部分。 flamegraph.pl 程序的輸出可以使用各種選項 (list -h) 進行自定義,包括標題。 Richard Warburton 的誠實剖析器基於相同的剖析技術,也能派上用場。 如果我打算在很長一段時間內收集大量數據,我可能會將採樣率從 100 赫茲降低到 50 赫茲或更低。