golang 大杀器之性能分析工具 PProf

前言

  • 写了几万行代码,提了几千个PR,上线部署之后发现
  • CPU占用高?内存占用高?WTF
  • 这个时候就需要加上性能分析工具,快速定位问题所在

工具介绍

  • 想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,涉及如下:
    • net/http/pprof:采集 HTTP Server 的运行时数据进行分析
    • runtime/pprof:采集程序(非 Server)的运行数据进行分析
  • 因为我主要是做服务器开发,因此我只将来第一种

HTTP Server

简单的demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

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

func test(str string) string {
strBytes := []byte(str)
for i := 0; i < 10; i++ {
strBytes = append(strBytes, []byte(str)...)
}
return string(strBytes)
}

func main() {
go func() {
for {
log.Println(test("this is a test string, do something to use CPU & MEM\n"))
}
}()

http.ListenAndServe(":6060", nil)
}
  • 运行这个文件,你的 HTTP 服务会多出 /debug/pprof 的 endpoint 可用于观察应用程序的情况

分析

通过Web界面

  • 访问 http://127.0.0.1:6060/debug/pprof/, 查看你的 HTTP Server 的运行情况
    pprof
  • 下面有对每一个采集的解释,我来提及几个重要的指标
    • profile:CPU使用情况的采集,默认进行30s的 CPU Profiling,得到一个用于分析的profile文件,如何分析后文会继续叙述。
    • goroutine:goroutine分析,可以看出 goroutine 的总量以及每个 goroutine 的具体执行代码
    • mutex:导致互斥锁的竞争持有者的堆栈跟踪

通过交互式终端

PProf 可视化界面

  • 在第一中分析方法通过Web界面下载到的文件可以通过可视化的界面来进行分析
  • 或者在第二种分析方法中,进入交互界面之后,输入web也是可以进入图形界面的哦
  • 具体的方法如下所示:
    1
    go tool pprof -http=:8080 cpu.prof
    web
  • 这样即可在 localhost:8080 中即可访问
    web-graph
  • 如果出现 Could not execute dot; may need to install graphviz.,就是提示你要安装 graphviz