孟冉: Linux火焰圖的數據流程分析

原創 孟冉 Linux閱碼場 2017-11-15html


內容簡介:
本文緊接着《宋寶華:火焰圖:全局視野的Linux性能剖析》一文,繼續分析火焰圖的數據流程和繪製原理。linux

做者簡介
孟冉,目前就讀於西安郵電大學,計算機科學與技術專業;目前研究linux系統的負載均衡技術和網絡安全方面。孟冉目前在陳莉君老師的Linux 3+1實驗室,並正在努力朝LEP(Linux Easy Profiling, http://www.linuxep.com)添加一鍵火焰圖支持git

孟冉: Linux火焰圖的數據流程分析

火焰圖簡介

火焰圖是將當前系統的部分信息利用特殊圖表的方式進行展現,能夠將大量的數據匯聚到一張簡明扼要的途中。火焰圖能夠直觀的反映出當前系統性能佔用狀況,很適合應用於服務器性能的監控中。根據系統性能的指標能夠將火焰圖分爲多種,常見的有on-cpu和off-cpu兩種火焰圖,下面是生成一個on-cpu火焰圖的過程。
相關閱讀:
宋寶華:火焰圖:全局視野的Linux性能剖析github

火焰圖生成流程

以on-CPU火焰圖爲例,生成一張火焰圖的大體過程以下:採集系統信息,處理信息,生成火焰圖。
採集信息
採集信息有不少種方法,這裏使用的是perf工具採集:vim

  • 採集指定進程信息
# perf record -F 99 –p 13204 -g -- sleep 60

-F 99表示每秒99次,-p 13204是進程號,即對哪一個進程進行分析,-g表示記錄調用棧,sleep 60則是持續60秒。安全

  • 採集全部進程信息
    # perf record -F 99 –a -g -- sleep 60
  • 查看採集到的信息
    # perf script

    查看採集到的信息,下面是其中一段。其實就是一個棧回溯:
    孟冉: Linux火焰圖的數據流程分析
    採樣到的棧回溯信息是巨量的,顯然須要進行加工處理。服務器

    處理信息

    處理信息須要工具,能夠從github上下載:網絡

    # git clone https://github.com/brendangregg/FlameGraph

    利用裏面的工具處理採集到的數據:app

    # cd FlameGraph
    # perf script | ./stackcollapse-perf.pl > out.perf

    下面咱們詳細解釋一下perf script | ./stackcollapse-perf.pl > out.perf這個命令的含義。
    如前一節所描述,當信息採集完後會獲得到大量相似於前面已經顯示的數據單元的數據:
    孟冉: Linux火焰圖的數據流程分析
    有不少組數據單元是相同的,"perf script | ./stackcollapse-perf.pl > out.perf"命令中的 stackcollapse-perf.pl腳本會統計每一個調用棧回溯出現的次數,並將這一單元(以行爲單位從下到上)處理爲一行。上面的調用棧通過處理後獲得:
    swapper; x86_64_start_reservations; start_kernel; rest_init; cpu_startup_entry; arch_cpu_idle; default_idle; native_safe_halt 1
    這裏的1表示採樣數,若是採樣到多個相同的調用棧,則每次增長1。負載均衡

「perf script | ./stackcollapse-perf.pl > out.perf」生成的out.perf數據文件已經很方便閱讀了,咱們能夠根據須要作定製修改,好比不須要火焰圖中cpu_idle的信息:

# grep -v cpu_idle out.perf>out1.perf

不須要cpu_idle的火焰圖信息,則能夠過濾掉。固然也能夠直接用vim處理。

生成火焰圖

這裏生成的火焰圖是利用flamegraph.pl工具,有興趣的能夠本身作一個工具哦:

# ./flamegraph.pl out.perf > perf-kernel.svg   #將產生的數據生成火焰圖。

綜合上面的步驟,生成火焰圖須要採樣,生成數據文件(out.perf),將數據文件生成svg矢量圖,火焰圖就作好了(這臺linux沒有業務運行,因此火焰圖很簡單)。
孟冉: Linux火焰圖的數據流程分析

數據文件(out.perf)分析

若是想本身作一個相似於flamegraph.pl的工具,就須要知道flamegraph.pl作了哪些事情,先來看一下out.perf的內容吧!
這個是數據文件(out.perf)的內容,這裏的每一行對應火焰圖的一列:
孟冉: Linux火焰圖的數據流程分析

好比如今有一下數據文件:
a;b;c 1
a;b;d 2
a;e;f 1
flamegraph.pl腳本在繪製的過程以下:將一行繪製成一列,採樣數越大列就越寬;在生成svg圖裏面,同一級的一樣的函數名,合併在一塊兒。全部的列按照樣本數比例填滿火焰圖的總寬度(好比火焰總寬爲1200px,在下圖中A的寬度爲1200px,C爲300px)生成的svg火焰圖以下:
孟冉: Linux火焰圖的數據流程分析
若是採集的out.perf中的採樣數恰好都是1,那麼將out.perf中的文字縮小並旋轉後就會產生下面的圖片,恰好對應上面生成的火焰圖。這仍是頗有意思的。
孟冉: Linux火焰圖的數據流程分析

想要更深刻的瞭解火焰圖能夠去官網查看:http://www.brendangregg.com/flamegraphs.html
on-cpu資料:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
off-cpu資料:http://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html

相關文章
相關標籤/搜索