Golang pprof 性能分析與火焰圖

1. 安裝graphviz

1.1 下載 graphviz (windows 環(huán)境)

https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

下載完之后安裝,安裝完成之后將graphviz的安裝bin目錄加入環(huán)境變量中

# 例如 
C:\Program Files (x86)\Graphviz2.38\bin

1.2 測試graphviz是否安裝成功

dot -version
dot - graphviz version 2.38.0 (20140413.2041)
libdir = "C:\Program Files (x86)\Graphviz2.38\bin"
Activated plugin library: gvplugin_dot_layout.dll
Using layout: dot:dot_layout
Activated plugin library: gvplugin_core.dll
Using render: dot:core
Using device: dot:dot:core
The plugin configuration file:
        C:\Program Files (x86)\Graphviz2.38\bin\config6
                was successfully loaded.
    render      :  cairo dot fig gd gdiplus map pic pov ps svg tk vml vrml xdot
    layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
    textlayout  :  textlayout
    device      :  bmp canon cmap cmapx cmapx_np dot emf emfplus eps fig gd gd2 gif gv imap imap_np ismap jpe jpeg jpg metafile pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4
    loadimage   :  (lib) bmp eps gd gd2 gif jpe jpeg jpg png ps svg
    

2. 使用pprof

2.1 修改代碼

main.go

import "net/http"
import _ "net/http/pprof"
func main() {
    http.ListenAndServe("0.0.0.0:8080", nil)
}

啟動程序

go run main.go

# 通過瀏覽器訪問
http://127.0.0.1:8080/debug/pprof/
# 訪問該地址將看到性能分析界面

2.2 火焰圖生成

在命令行下執(zhí)行

go tool pprof -http=:1234 http://localhost:8080/debug/pprof/profile
# 執(zhí)行上述命令稍微等會,瀏覽器上會出現(xiàn)一UI界面
VIEW->Flame Graph
看到火焰圖

3. Gin框架使用pprof

3.1 安裝需要包

進入項目根目錄,安裝gin使用的pprof包

 go get github.com/gin-contrib/pprof

在項目中使用pprof
example:

package main

import (
    "github.com/gin-contrib/pprof"
    "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  pprof.Register(router)
  router.Run(":8080")
}

3.2 啟動程序

啟動程序之后會看到很多自動添加pprof 相關(guān)的接口

通過這些接口我們可以進行分析

go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /debug/pprof/             --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/cmdline      --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/profile      --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] POST   /debug/pprof/symbol       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/symbol       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/trace        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/allocs       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/block        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/goroutine    --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/heap         --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/mutex        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/threadcreate --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
 ...
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

通過瀏覽器訪問

http://127.0.0.1:8080/debug/pprof/
pprof1.png
allocs :過去所有內(nèi)存分配的抽樣
block :導(dǎo)致在同步基元上阻塞的堆棧跟蹤
cmdline :當(dāng)前程序的命令行調(diào)用
goroutine :goroutine堆棧跟蹤
heap :活動對象的內(nèi)存分配的采樣
mutex :爭用互斥鎖的持有者的堆棧跟蹤
profile :CPU摘要信息灾梦。您可以在seconds GET參數(shù)中指定持續(xù)時間。獲得概要文件之后豌熄,使用go工具pprof命令來調(diào)查該概要文件顷歌。
threadcreate : 操作系統(tǒng)線程堆棧跟蹤
trace : 當(dāng)前程序的執(zhí)行軌跡。您可以在seconds GET參數(shù)中指定持續(xù)時間邻储。獲得跟蹤文件后赋咽,使用go工具跟蹤命令來調(diào)查跟蹤。

3.3 火焰圖

在新的命令行窗口

# 執(zhí)行命令后,會在瀏覽器打開一個窗口
go tool pprof -http=:1234 http://localhost:8080/debug/pprof/goroutine

# 簡單解釋
# -http 表示使用交互式web接口查看獲取的性能信息,指定可用的端口即可
# debug/pprof/需要查看的指標(biāo) (allocs,block,goroutine,heap...)

在瀏覽器中能看到如下的性能分析圖:

pprof2.png

火焰圖:

pprof3.png

3.4 pprof命令行

在命令行下可以看到性能數(shù)據(jù)

使用 go tool pprof + 數(shù)據(jù)源

example :

go tool pprof http://127.0.0.1:8080/debug/pprof/allocs

命令行下執(zhí)行 ,常用的命令有top,tree,web等,通過help命令查看更多

PS G:\> go tool pprof http://127.0.0.1:8080/debug/pprof/allocs
Fetching profile over HTTP from http://127.0.0.1:8080/debug/pprof/allocs
Saved profile in C:\Users\captain\pprof\pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz
Type: alloc_space
Time: Sep 19, 2020 at 3:53pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
# help 命令可以查看所有命令
# top [n] 查看性能指標(biāo)數(shù)據(jù)
(pprof) top 5
Showing nodes accounting for 1026.66kB, 100% of 1026.66kB total
Showing top 5 nodes out of 11
      flat  flat%   sum%        cum   cum%
  514.63kB 50.13% 50.13%   514.63kB 50.13%  math/rand.NewSource
  512.03kB 49.87%   100%   512.03kB 49.87%  regexp/syntax.(*parser).maybeConcat
         0     0%   100%   512.03kB 49.87%  github.com/jinzhu/gorm.init.ializers
         0     0%   100%   514.63kB 50.13%  math/rand.init.ializers
         0     0%   100%   512.03kB 49.87%  regexp.Compile
# tree [n] 以樹形顯示指標(biāo)數(shù)據(jù)        
(pprof) tree 5
Showing nodes accounting for 1026.66kB, 100% of 1026.66kB total
Showing top 5 nodes out of 11
----------------------------------------------------------+-------------
      flat  flat%   sum%        cum   cum%   calls calls% + context
----------------------------------------------------------+-------------
                                          514.63kB   100% |   math/rand.init.ializers
  514.63kB 50.13% 50.13%   514.63kB 50.13%                | math/rand.NewSource
----------------------------------------------------------+-------------
                                          512.03kB   100% |   regexp.Compile
  512.03kB 49.87%   100%   512.03kB 49.87%                | regexp/syntax.(*parser).maybeConcat
----------------------------------------------------------+-------------
         0     0%   100%   512.03kB 49.87%                | github.com/jinzhu/gorm.init.ializers
                                          512.03kB   100% |   regexp.Compile
----------------------------------------------------------+-------------
         0     0%   100%   514.63kB 50.13%                | math/rand.init.ializers
                                          514.63kB   100% |   math/rand.NewSource
----------------------------------------------------------+-------------
                                          512.03kB   100% |   github.com/jinzhu/gorm.init.ializers
         0     0%   100%   512.03kB 49.87%                | regexp.Compile
                                          512.03kB   100% |   regexp/syntax.(*parser).maybeConcat
----------------------------------------------------------+-------------      

# web命令是希望通過web形式(在瀏覽器器中看到),因為前面已經(jīng)安裝了graphviz,所以web可以使用
# web命令會直接打開瀏覽器
(pprof) web
pprof4.png

參考文檔

- [1] gin-contrib/pprof
- [2] pprof

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吨娜,一起剝皮案震驚了整個濱河市脓匿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宦赠,老刑警劉巖陪毡,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米母,死亡現(xiàn)場離奇詭異,居然都是意外死亡毡琉,警方通過查閱死者的電腦和手機铁瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桅滋,“玉大人慧耍,你說我怎么就攤上這事∈幔” “怎么了蜂绎?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笋鄙。 經(jīng)常有香客問我师枣,道長,這世上最難降的妖魔是什么萧落? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任践美,我火速辦了婚禮,結(jié)果婚禮上找岖,老公的妹妹穿的比我還像新娘陨倡。我一直安慰自己,他們只是感情好许布,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布兴革。 她就那樣靜靜地躺著,像睡著了一般蜜唾。 火紅的嫁衣襯著肌膚如雪杂曲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天袁余,我揣著相機與錄音擎勘,去河邊找鬼。 笑死颖榜,一個胖子當(dāng)著我的面吹牛棚饵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掩完,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼噪漾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了且蓬?” 一聲冷哼從身側(cè)響起欣硼,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缅疟,沒想到半個月后分别,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡存淫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年耘斩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桅咆。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡括授,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岩饼,到底是詐尸還是另有隱情荚虚,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布籍茧,位于F島的核電站版述,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寞冯。R本人自食惡果不足惜渴析,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吮龄。 院中可真熱鬧俭茧,春花似錦、人聲如沸漓帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尝抖。三九已至毡们,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牵署,已是汗流浹背漏隐。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奴迅,地道東北人青责。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像取具,于是被迫代替她去往敵國和親脖隶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345