go 的性能分析工具 pprof

pprof 功能有2種開(kāi)啟方式,對(duì)應(yīng)兩種包:

  • net/http/pprof:使用服務(wù)器的場(chǎng)景
  • runtime/pprof:使用在非服務(wù)器應(yīng)用程序的場(chǎng)景

這兩個(gè)本質(zhì)上是一致的,net/http/pporf 也只是在 runtime/pprof 上的一層 web 封裝

pprof 支持四種類型的分析:

  • CPU
    CPU 分析,采樣消耗 cpu 的調(diào)用,這個(gè)一般用來(lái)定位排查程序里耗費(fèi)計(jì)算資源的地方。
  • Memory
    內(nèi)存分析,一般用來(lái)排查內(nèi)存占用,內(nèi)存泄露等問(wèn)題。
  • Block
    阻塞分析,會(huì)采樣程序里阻塞的調(diào)用情況。
  • Mutex
    互斥鎖分析,采樣互斥鎖的競(jìng)爭(zhēng)情況。
一個(gè)簡(jiǎn)單的例子
package main

import (
    "fmt"
    "net/http"
    _ "net/http/pprof"
)

var datas []string

func add(s string) []string {
    datas = append(datas, s)
    return datas
}

func main() {
    go func() {
        for {
            fmt.Println(add("hello world"))
        }
    }()

    http.ListenAndServe("0.0.0.0:6060", nil)
}

直接web訪問(wèn):http://127.0.0.1:6060/debug/pprof/

image.png

需要注意的是:默認(rèn)情況下是不會(huì)追蹤 block 和 mutex 信息的,如果想要看這2個(gè)信息,需要在代碼中加入:

runtime.SetBlockProfileRate(1) // 開(kāi)啟對(duì)阻塞操作的跟蹤,block  
runtime.SetMutexProfileFraction(1) // 開(kāi)啟對(duì)鎖調(diào)用的跟蹤,mutex

這上面最能看出來(lái)的是 goroutine,可以從上面看出當(dāng)前系統(tǒng) goroutine 數(shù)量,這個(gè)對(duì)于定位 goroutine 數(shù)量泄漏非常方便。

分析數(shù)據(jù)

go tool pprof 工具可進(jìn)行數(shù)據(jù)的分析。
命令格式:

go tool pprof [binary] [source]
- binary 是應(yīng)用的二進(jìn)制文件,用來(lái)解析各種符號(hào),也可以不填。
- source 表示 profile 數(shù)據(jù)的來(lái)源,可以是本地的文件,也可以是 http 地址。

舉例:

# cpu profile
go tool pprof http://127.0.0.1:6060/debug/pprof/profile

運(yùn)行上述命令將會(huì)采樣半分鐘的cpu數(shù)據(jù)并進(jìn)入一個(gè)交互界面,可以通過(guò)輸入命令查看分析結(jié)果:


image.png

接著我們可以輸入一些命令,來(lái)獲取一些信息:

  • top
    列出cpu占用高的函數(shù)


    image.png

    還可以使用top20查看前20個(gè)函數(shù)。

  • list
    還可以使用list 函數(shù)名命令查看具體的函數(shù)分析,例如執(zhí)行l(wèi)ist logicCode查看我們編寫的函數(shù)的詳細(xì)分析。

  • traces
    列出函數(shù)調(diào)用棧

  • svg
    可以生成圖形的形式查看當(dāng)前資源監(jiān)控。需要事先安裝 graphviz。


    image.png
內(nèi)存分配相關(guān)的數(shù)據(jù)查看
  • 查看當(dāng)前內(nèi)存分配數(shù)據(jù)
    go tool pprof -inuse_space http://127.0.0.1:8080/debug/pprof/heap
    go tool pprof -inuse_objects http://127.0.0.1:8080/debug/pprof/heap
    
  • 查看總共的內(nèi)存分配數(shù)據(jù)
    go tool pprof -alloc_space http://127.0.0.1:8080/debug/pprof/heap
    go tool pprof -alloc_objects http://127.0.0.1:8080/debug/pprof/heap
    
火焰圖

golang性能監(jiān)控結(jié)果可以轉(zhuǎn)換成火焰圖來(lái)進(jìn)行直觀展示。
有兩種方式:go-torch(golang version < 1.10)和 golang原生的pprof(golang version > 1.10+的pprof集成了火焰圖功能)。
這里只介紹golang官方的火焰圖。

go tool pprof -http=:6061 http://localhost:6060/debug/pprof/profile

從執(zhí)行命令的過(guò)程,可以看到pprof工具 http://localhost:6060/debug/pprof/profile 獲取監(jiān)控?cái)?shù)據(jù),并保存到地:xxx.005.pb.gz。
然后對(duì)該文件進(jìn)行分析,并啟動(dòng)一個(gè)Web服務(wù)器:http://localhost:6061??梢詮牡谝恍械牟藛沃星袚QView,選擇Flame Graph即可顯示火焰圖。

火焰圖的調(diào)用順序從下到上,每個(gè)方塊代表一個(gè)函數(shù),它上面一層表示這個(gè)函數(shù)會(huì)調(diào)用哪些函數(shù),方塊的大小代表了占用資源值的多少(例如,CPU使用時(shí)間的長(zhǎng)短,內(nèi)存使用的大小等)。

pprof 與測(cè)試的結(jié)合

go test 命令有兩個(gè)參數(shù)和 pprof 相關(guān),它們分別指定生成的 CPU 和 Memory profiling 保存的文件:

  • cpuprofile:cpu profiling 數(shù)據(jù)要保存的文件地址
  • memprofile:memory profiling 數(shù)據(jù)要報(bào)文的文件地址

比如下面執(zhí)行測(cè)試的同時(shí),也會(huì)執(zhí)行 CPU profiling,并把結(jié)果保存在 cpu.prof 文件中:

go test -bench . -cpuprofile=cpu.prof

參考資料
1、Go語(yǔ)言之pprof的性能調(diào)優(yōu)
2、https://mp.weixin.qq.com/s/SvzMEdhxHfI9hYU62r1C7g
3、https://zhuanlan.zhihu.com/p/396363069
4、https://zhuanlan.zhihu.com/p/265080950

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容