<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)神器,真香!

          共 3751字,需瀏覽 8分鐘

           ·

          2021-10-29 20:58

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          來源: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á)絕對值時(shí),自然是無往不利,但在展示相對值時(shí),就有些捉襟見肘了,就更不用說多維數(shù)據(jù)了。

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

          今天就準(zhǔn)備介紹一種圖,火焰圖,之前組內(nèi)大神分享過它的使用辦法,但我之后很久都沒有用過,以至于對它沒有什么深刻印象,最近排查我們 Java 應(yīng)用負(fù)載問題時(shí)試用了一下,這才對它的用途有了點(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)用。46 張 PPT 弄懂 JVM 性能調(diào)優(yōu)分享給你。

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

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

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          介紹

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

          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ì)說明。

          最新面試題整理好了,點(diǎn)擊Java面試庫小程序在線刷題。

          特性

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

          分析

          那么,給我們一張火焰圖,我們怎么能看出系統(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í)并沒有異常。

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

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

          推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/javastack

          應(yīng)用場景

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

          實(shí)現(xiàn)

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

          生成工具

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

          這個(gè)命令還可以傳入各種參數(shù),支持我們修改火焰圖的顏色、大小等 。另外,JVM 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺(tái)發(fā)送:面試,可以在線閱讀。

          但 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 簡單地實(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)對方式。

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





          關(guān)注Java技術(shù)??锤喔韶?/strong>



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 44
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(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>
                  天天日天天干麻豆 | 久久无码专区 | 狼人综合久久网 | 免费黄色a片子 | 综合久久久福利蜜芽 |