<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>

          又一款性能調(diào)優(yōu)神器,真香!

          共 3702字,需瀏覽 8分鐘

           ·

          2021-11-14 02:48

          上一篇:基于Spring Cloud的微服務(wù)架構(gòu)分析

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

          前言

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

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

          我們用 shell 可以非??焖俚夭樵兂鑫谋緝?nèi)的累加值、最大值等,但一遇到兩組值的相關(guān)性分析時(shí),就束手無策了。這個(gè)時(shí)候,就需要使用另一種分析工具 –?了,如散點(diǎn)圖就能很清晰地展示相關(guān)性。

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

          介紹

          引子

          在排查性能問題時(shí),我們通常會(huì)把線程棧 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)耗時(shí)最多的調(diào)用。

          至于其原理,設(shè)想廣場(chǎng)上有一個(gè)大屏幕在不停地播放各種廣告。如果我們隨機(jī)對(duì)大屏幕拍照,次數(shù)多了,統(tǒng)計(jì)照片中各個(gè)廣告出現(xiàn)的頻率,基本可以得出每個(gè)廣告的播放時(shí)長(zhǎng)占比了。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。

          而我們應(yīng)用的資源就像大屏幕,每次調(diào)用就像是播放一次廣告,統(tǒng)計(jì) dump 出的線程棧出現(xiàn)比例,也就基本能看出線程棧的耗時(shí)占比,雖然有誤差,但是多次統(tǒng)計(jì)下應(yīng)該差不了多少。這也就是為什么有些家長(zhǎng)每次進(jìn)孩子房間都發(fā)現(xiàn)孩子在看系統(tǒng)桌面后以為孩子平時(shí)喜歡對(duì)著桌面發(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 挺費(fèi)事的,另外如果我想查看自棧頂?shù)诙€(gè)棧的最多調(diào)用,即使修改了 shell 命令,結(jié)果也不直觀。

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

          介紹

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

          https://github.com/brendangregg/FlameGraph

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


          當(dāng)我們點(diǎn)擊方塊時(shí),圖片會(huì)從我們點(diǎn)擊的方塊為基底向上展開,而我們鼠標(biāo)指向方塊時(shí),會(huì)展示出方塊的詳細(xì)說明。

          特性

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

          分析

          那么,給我們一張火焰圖,我們?cè)趺茨芸闯鱿到y(tǒng)哪里有問題呢?

          由上文中的火焰圖特性特性,查看火焰圖時(shí),我們最主要的關(guān)注點(diǎn)要放在方塊的寬度上,因?yàn)閷挾却砹苏{(diào)用棧在全局出現(xiàn)的次數(shù),次數(shù)代表著出現(xiàn)頻率,而頻率也就可以說明耗時(shí)。

          但是觀察火焰圖底部或中部方塊的寬度占比意義不大,如上面的火焰圖,中部的?do_redirections?函數(shù)寬度是 24.87%,也就是說它耗用了整個(gè)應(yīng)用近四分之一的時(shí)間,但是真正消耗時(shí)間的并不是 do_redirections 函數(shù),而是 do_redirections 內(nèi)部又調(diào)用的其他函數(shù),而它的子調(diào)用分為了很多個(gè),每個(gè)調(diào)用的耗時(shí)并沒有異常。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。

          我們更應(yīng)該關(guān)注的是火焰圖頂部的一些 “平頂山”,頂部說明它沒有子調(diào)用,方塊寬說明它耗時(shí)長(zhǎng),長(zhǎng)時(shí)間 hang 住,或者被非常頻率地調(diào)用,這種方塊指向的調(diào)用才是性能問題的罪魁禍?zhǔn)住?/span>

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

          應(yīng)用場(chǎng)景

          每種工具都有其適合的應(yīng)用場(chǎng)景,火焰圖則適合用在:

          實(shí)現(xiàn)

          既然火焰圖這么強(qiáng)大,那么我們?cè)撛趺磳?shí)現(xiàn)呢?

          生成工具

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

          這個(gè)命令還可以傳入各種參數(shù),支持我們修改火焰圖的顏色、大小等 。另外,JVM 系列面試題和答案全部整理好了,微信搜互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

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

          a;b;c?12
          a;d?3
          b;c?3
          z;d?5
          a;c;e?3
          前面是調(diào)用鏈,每個(gè)調(diào)用之間用?;?隔開,每行后面的數(shù)字是調(diào)用棧出現(xiàn)的次數(shù)。

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

          數(shù)據(jù)準(zhǔn)備

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

          也可以用 shell 簡(jiǎn)單地實(shí)現(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é)完了,以后再遇到性能問題又多了一種應(yīng)對(duì)方式。

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

          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

          ??? · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!


          瀏覽 46
          點(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>
                  欧美精品在线观看网站 | 成人自拍视频在线观看 | 九九福利| 中文字幕久久精品 | 黄片无码视频 |