2024. 2. 6. 17:56ㆍProgramming/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 |