日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

超牛逼的性能调优利器 — 火焰图

發(fā)布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 超牛逼的性能调优利器 — 火焰图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊關注公眾號,回復“1024”獲取2TB學習資源!

前言

工具的進化一直是人類生產(chǎn)力進步的標志,合理使用工具能大大提高我們的工作效率,遇到問題時,合理使用工具更能加快問題排查的進度。這也是我為什么非常喜歡 shell 的原因,它豐富的命令行工具集加管道特性處理起文本數(shù)據(jù)集來真的精準而優(yōu)雅,讓人迷醉。超牛逼!100 個開箱即用的 Shell 腳本,拿好了~

但很多時候文本的表現(xiàn)力非常有限,可以說匱乏,表達絕對值時,自然是無往不利,但在展示相對值時,就有些捉襟見肘了,就更不用說多維數(shù)據(jù)了。

我們用 shell 可以非常快速地查詢出文本內(nèi)的累加值、最大值等,但一遇到兩組值的相關性分析時,就束手無策了。這個時候,就需要使用另一種分析工具 – 圖了,如散點圖就能很清晰地展示相關性。

今天就準備介紹一種圖,火焰圖,之前組內(nèi)大神分享過它的使用辦法,但我之后很久都沒有用過,以至于對它沒有什么深刻印象,最近排查我們 Java 應用負載問題時試用了一下,這才對它的用途有了點心得。

介紹

引子

在排查性能問題時,我們通常會把線程棧 dump 出來,然后使用

grep?--no-group-separator?-A?1?java.lang.Thread.State?jstack.log?|?awk?'NR%2==0'?|?sort?|?uniq?-c?|?sort?-nr

類似的 shell 語句,查看大多數(shù)線程棧都在干什么。而由線程棧的出現(xiàn)頻率,來推斷 JVM 內(nèi)耗時最多的調(diào)用。Java 虛擬機(JVM)面試題(2021最新版)

至于其原理,設想廣場上有一個大屏幕在不停地播放各種廣告。如果我們隨機對大屏幕拍照,次數(shù)多了,統(tǒng)計照片中各個廣告出現(xiàn)的頻率,基本可以得出每個廣告的播放時長占比了。

而我們應用的資源就像大屏幕,每次調(diào)用就像是播放一次廣告,統(tǒng)計 dump 出的線程棧出現(xiàn)比例,也就基本能看出線程棧的耗時占比,雖然有誤差,但是多次統(tǒng)計下應該差不了多少。這也就是為什么有些家長每次進孩子房間都發(fā)現(xiàn)孩子在看系統(tǒng)桌面后以為孩子平時喜歡對著桌面發(fā)呆的原因。:)

2444??at?org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1200) 1587??at?sun.misc.Unsafe.park(Native?Method) 795??at?java.security.Provider.getService(Provider.java:1035) 293??at?java.lang.Object.wait(Native?Method) 292??at?java.lang.Thread.sleep(Native?Method)73??at?org.apache.logging.log4j.core.layout.TextEncoderHelper.copyDataToDestination(TextEncoderHelper.java:61)71??at?sun.nio.ch.EPollArrayWrapper.epollWait(Native?Method)70??at?java.lang.Class.forName0(Native?Method)54??at?org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:217)

但是這樣有些問題,首先寫 shell 挺費事的,另外如果我想查看自棧頂?shù)诙€棧的最多調(diào)用,即使修改了 shell 命令,結(jié)果也不直觀。

產(chǎn)生這個問題的主要原因是,我們的線程棧是有調(diào)用關系的,即我們需要考慮線程棧的 調(diào)用鏈 和 出現(xiàn)頻率 兩個維度,而單一的文本表現(xiàn)這兩種維度比較困難,所以,著名性能分析大師 brendan gregg 就提出了火焰圖。

介紹

火焰圖,因其形似火焰而得名,其開源代碼地址:

https://github.com/brendangregg/FlameGraph

它是一種 svg 可交互式圖形,我們通過點擊和鼠標指向可以展示出更多的信息。下圖就是一個典型的火焰圖,從結(jié)構(gòu)上,它是由多個大小和顏色各異的方塊構(gòu)成,每個方塊上都有字符,它們底部連接在一塊,組成火焰的基底,頂部分出許多”小火苗”。

當我們點擊方塊時,圖片會從我們點擊的方塊為基底向上展開,而我們鼠標指向方塊時,會展示出方塊的詳細說明。

特性

介紹火焰圖的分析前,我們要首先說明它的特性:

  • 由底部到頂部可以追溯一個唯一的調(diào)用鏈,下面的方塊是上面方塊的父調(diào)用。

  • 同一父調(diào)用的方塊從左到右以字母序排列。

  • 方塊上的字符表示一個調(diào)用名稱,括號內(nèi)是火焰圖指向的調(diào)用在火焰圖中出現(xiàn)的次數(shù)和這個方塊占最底層方塊的寬度百分比。

  • 方塊的顏色沒有實際意義,相鄰方塊的顏色差只為了便于查看。

分析

那么,給我們一張火焰圖,我們怎么能看出系統(tǒng)哪里有問題呢?

由上文中的火焰圖特性特性,查看火焰圖時,我們最主要的關注點要放在方塊的寬度上,因為寬度代表了調(diào)用棧在全局出現(xiàn)的次數(shù),次數(shù)代表著出現(xiàn)頻率,而頻率也就可以說明耗時。

但是觀察火焰圖底部或中部方塊的寬度占比意義不大,如上面的火焰圖,中部的 do_redirections 函數(shù)寬度是 24.87%,也就是說它耗用了整個應用近四分之一的時間,但是真正消耗時間的并不是 do_redirections 函數(shù),而是 do_redirections 內(nèi)部又調(diào)用的其他函數(shù),而它的子調(diào)用分為了很多個,每個調(diào)用的耗時并沒有異常。

我們更應該關注的是火焰圖頂部的一些 “平頂山”,頂部說明它沒有子調(diào)用,方塊寬說明它耗時長,長時間 hang 住,或者被非常頻率地調(diào)用,這種方塊指向的調(diào)用才是性能問題的罪魁禍首。

找到了異常調(diào)用,直接優(yōu)化它,或者再根據(jù)火焰圖的調(diào)用鏈層層向下,找到我們的業(yè)務代碼進行優(yōu)化,也就大功告成。

應用場景

每種工具都有其適合的應用場景,火焰圖則適合用在:

  • 代碼循環(huán)分析:如果代碼中有很大的循環(huán)或死循環(huán)代碼,那么從火焰圖的頂部或接近項部的地方會有很明顯的”平頂”,表示代碼頻繁地在某個線程棧上下切換。但需要注意的是,如果循環(huán)的總耗時不長,在火焰圖上不會很明顯。

  • IO 瓶頸/鎖分析:在我們的應用代碼中,我們的調(diào)用普遍都是同步的,也就是說在進行網(wǎng)絡調(diào)用、文件 I/O 操作或未成功獲得鎖時,線程會停留在某個調(diào)用上等待 I/O 響應或鎖,如果這個等待非常耗時,會導致線程在某個調(diào)用上一直 hang 住,這在火焰圖上表現(xiàn)得會非常清晰。與此相對的是,我們應用線程構(gòu)成的火焰圖無法準確地表達 CPU 的消耗,因為應用線程內(nèi)沒有系統(tǒng)的調(diào)用棧,在應用線程棧 hang 住時,CPU 可能去做其他事了,導致我們看到耗時很長,而 CPU 卻很閑。

  • 火焰圖倒置分析全局代碼:火焰圖倒置有時也會很實用,如果我們的代碼 N 個不同的分支都調(diào)用某一方法,倒置后,所有棧頂相同的調(diào)用被合并在一塊,我們就能看出這個方法的總耗時,也就很容易評估出優(yōu)化這個方法的收益。

實現(xiàn)

既然火焰圖這么強大,那么我們該怎么實現(xiàn)呢?

生成工具

brendan gregg 大神已經(jīng)把生成火焰圖的方法用 perl 實現(xiàn)了,開源代碼就在上文的 Github 倉庫中,根目錄下的 flamegraph.pl 文件就是可執(zhí)行的 perl 文件了。

這個命令還可以傳入各種參數(shù),支持我們修改火焰圖的顏色、大小等。

但 flamegraph.pl 只能處理特定格式的文件,像:

a;b;c?12 a;d?3 b;c?3 z;d?5 a;c;e?3

前面是調(diào)用鏈,每個調(diào)用之間用 ; 隔開,每行后面的數(shù)字是調(diào)用棧出現(xiàn)的次數(shù)。

如上面的數(shù)據(jù),用 flamegraph.pl 生成的火焰圖如下圖:

數(shù)據(jù)準備

至于我們的 jstack 信息如何被處理成上面的格式,大神則為常見的 dump 格式都提供了工具,像 stackcollapse-perf.pl可以處理 perf 命令的輸出,stackcollapse-jstack.pl 處理 jstack 輸出,stackcollapse-gdb.pl 處理 gdb 輸出的棧等。

也可以用 shell 簡單地實現(xiàn)一下 jstack 的處理方式:

grep?-v?-P?'.+prio=d+?os_prio=d+'?|?grep?-v?-E?'locked?<'?|?awk?'{if?($0==""){print?$0}else{printf"%s;",$0}}'?|?sort?|?uniq?-c?|?awk?'{a=$1;$1="";print?$0,a}'

小結(jié)

火焰圖總結(jié)完了,以后再遇到性能問題又多了一種應對方式。

做開發(fā)越久,越能感受得到工具的重要性,所以我準備加一個專題來專門介紹我使用的各種工具。當然,這也就更需要我更多地了解、使用和總結(jié)新的工具了。

來源:https://zhenbianshu.github.io

推薦閱讀?點擊標題可跳轉(zhuǎn)

一互聯(lián)網(wǎng)公司被警方一鍋端了!這種崗位千萬別干!

入職 6 個月,被裁員。。。

武大 94 年博士年薪 201 萬入職華為!學霸日程表曝光

或?qū)⑷〈朴嬎?#xff01;下一個技術(shù)風口來了

行業(yè)巨變!下一代 PC 硬件架構(gòu)來了

微信輸入法來了!拒絕任何竊聽

OAuth2 vs JWT,到底怎么選?

SpringCloud Gateway 詳解

MySQL 性能優(yōu)化的 9 種姿勢,面試再也不怕了!

PS:因為公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下“在看”,加個“星標”,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。

隨手在看、轉(zhuǎn)發(fā)是最大的支持!

總結(jié)

以上是生活随笔為你收集整理的超牛逼的性能调优利器 — 火焰图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。