
基本介绍
pprof 是在做性能优化前的性能分析工具。
安装: go get -u github.com/google/pprof
分析工具
go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。
两种应用
- 服务型应用
_ "net/http/pprof"包,专用于采集 web 服务 运行数据的分析。即在运行的服务中通过 API 调用取数据。 - 工具型应用
"runtime/pprof"包,专用于采集 应用程序 运行数据的分析。通过代码手动添加收集命令。
服务型应用场景中因为应用要一直提供服务。所以 pprof 是通过 API 访问来获取,pprof 使用了默认的 http.DefaultServeMux 挂在这些 API 接口。开发者也可以手动注册路由规则挂载 API,如 r.HandleFunc("/debug/pprof/debugopen", openFunc)
工具性应用是一个提供特定功能使用的工具,使用完就会退出进程的应用。开发者手动控制把 profile 文件保存到报告文件中。
封装了接口可以调用,如要进行 CPU Profiling,则调用 pprof.StartCPUProfile(w io.Writer) 写入到 w 中,停止时调用 StopCPUProfile();要获取内存数据,直接使用 pprof.WriteHeapProfile(w io.Writer) 函数则可。
可以做?
可以做( $host/debug/pprof/$type, $type 即下方列表的英文单词):
- CPU 分析(profile): 你可以在 url 上用
seconds参数指定抽样持续时间(默认 30s),你获取到概览文件后可以用go tool pprof命令调查这个概览 - 内存分配(allocs): 所有内存分配的抽样
- 阻塞(block): 堆栈跟踪导致阻塞的同步原语
- 命令行调用(cmdline): 命令行调用的程序
- goroutine: 当前 goroutine 的堆栈信息
- 堆(heap): 当前活动对象内存分配的抽样,完全也可以指定
gc参数在对堆取样前执行 GC - 互斥锁(mutex): 堆栈跟踪竞争状态互斥锁的持有者
- 系统线程的创建(threadcreate): 堆栈跟踪系统新线程的创建
- trace: 追踪当前程序的执行状况. 你可以用
seconds参数指定抽样持续时间. 你获取到 trace 概览后可以用go tool pprof命令调查这个 trace
基本使用
(初学,以下暂时均以 net/http/pprof 使用为例)
- 编写 Demo 文件 demo.go,运行这个文件
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
for {
log.Println(Add("Hello world"))
}
}()
http.ListenAndServe("0.0.0.0:6060", nil)
}
var datas []string
func Add(str string) string {
data := []byte(str)
sData := string(data)
datas = append(datas, sData)
return sData

pprof是Golang的性能分析工具,适用于服务型和工具型应用。它提供了CPU、内存等多方面的分析,可以通过Web API或dump文件进行分析,支持命令行和可视化界面。文章介绍了pprof的基本使用,包括通过Web API分析、使用dump文件、CPU和heap profile的top命令,以及如何生成和理解火焰图。

1447

被折叠的 条评论
为什么被折叠?



