go profiler pprof 사용법

2024. 2. 6. 17:56Programming/JAVA, C++, Go, Rust

    목차
반응형

About pprof

go 프로그램을 프로파일링 하여 CPU나 memroy, 혹은 go 프로그램이 사용하는 go routine 개수와 같은 여러 자원들에 대해 동적 분석 결과를 수행하는 툴 입니다.

Usage

Recording

사용법은 매우 간단합니다.
go 언어의 시작 부분에서 다음의 고루틴을 실행한 후, 프로그램 종료 직전에 pprof를 닫으면 됩니다.

// import
_ "net/http/pprof"
... 

go func() {
  http.ListenAndServe(":6060", nil)
}()
...

f, err := os.Create("heap_usage_profile.mprof")
if err != nil {
  logger.Fatalf("heap_usage_profile.mprof: %v", err)
}
pprof.WriteHeapProfile(f)
f.Close()

Analysis

go tool pprof heap_usage_profile.mprof를 수행하여 분석 console인 다음의 화면으로 진입합니다.

(pprof) 

여기서 top50, top50 -cum과 같은 명령어를 실행하여 상세한 프로파일링된 정보를 쿼리할 수 있습니다.

(pprof) top10
Total: 2525 samples
     298  11.8%  11.8%      345  13.7% runtime.mapaccess1_fast64
     268  10.6%  22.4%     2124  84.1% main.FindLoops
     251   9.9%  32.4%      451  17.9% scanblock
     178   7.0%  39.4%      351  13.9% hash_insert
     131   5.2%  44.6%      158   6.3% sweepspan
     119   4.7%  49.3%      350  13.9% main.DFS
      96   3.8%  53.1%       98   3.9% flushptrbuf
      95   3.8%  56.9%       95   3.8% runtime.aeshash64
      95   3.8%  60.6%      101   4.0% runtime.settype_flush
      88   3.5%  64.1%      988  39.1% runtime.mallocgc
(pprof) top5 -cum
Total: 2525 samples
       0   0.0%   0.0%     2144  84.9% gosched0
       0   0.0%   0.0%     2144  84.9% main.main
       0   0.0%   0.0%     2144  84.9% runtime.main
       0   0.0%   0.0%     2124  84.1% main.FindHavlakLoops
     268  10.6%  10.6%     2124  84.1% main.FindLoops
(pprof) top5 -cum

list {function name}으로 코드 단위의 분석도 가능합니다.

(pprof) list DFS
Total: 2525 samples
ROUTINE ====================== main.DFS in /home/rsc/g/benchgraffiti/havlak/havlak1.go
   119    697 Total samples (flat / cumulative)
     3      3  240: func DFS(currentNode *BasicBlock, nodes []*UnionFindNode, number map[*BasicBlock]int, last []int, current int) int {
     1      1  241:     nodes[current].Init(currentNode, current)
     1     37  242:     number[currentNode] = current
     .      .  243:
     1      1  244:     lastid := current
    89     89  245:     for _, target := range currentNode.OutEdges {
     9    152  246:             if number[target] == unvisited {
     7    354  247:                     lastid = DFS(target, nodes, number, last, lastid+1)
     .      .  248:             }
     .      .  249:     }
     7     59  250:     last[number[currentNode]] = lastid
     1      1  251:     return lastid
(pprof)

Visual output

go tol pprof -http {port number} {file name}으로 시각화된 결과를 열람할 수 있습니다.

혹은

(pprof) web

(pprof) web mapaccess1

ref. 참고 사이트
https://go.dev/blog/pprof

https://pkg.go.dev/net/http/pprof

[pprof package - net/http/pprof - Go Packages

Discover Packages Standard library net http pprof Version: go1.21.6 Opens a new window with list of versions in this module. Published: Jan 9, 2024 License: BSD-3-Clause Opens a new window with license information. Imports: 18 Opens a new window with list

pkg.go.dev](https://pkg.go.dev/net/http/pprof)

반응형

'Programming > JAVA, C++, Go, Rust' 카테고리의 다른 글

go get 오류 발생 시 대처  (0) 2024.05.09
Study stuff for Golang  (0) 2023.07.24
Go test: table driven test with Parallel()  (0) 2023.06.22
Go gotcha examples  (0) 2023.06.22
Go에서 time의 ticker 사용  (0) 2023.06.21