1 pprof
1.1 原理
1.1.1 数据采样
1.1.1.1 cpu
- 定期采样:隔10ms sigprof中断一下,记录当前goroutine的所有函数栈信息
1.1.1.2 堆
- 默认1000次分配做一次采样
1.1.1.3 锁
- 默认不启用
1.1.1.4 阻塞时间
- 如从空channel中获取数据导致阻塞
1.1.2 采集方式
1.1.2.1 性能基准测试进行数据采集
- 在执行基准测试的同时进行性能数据采集:go test -bench -cpuporfile=cpu.profile
- 会编译出一个和这个测试对应的可执行文件,cpu.profile存储cpu采样数据,作为数据分析的输入
1.1.2.2 独立程序的性能数据采集
- runtime/pprof提供了低级api对程序性能数据采集
- net/http/pprof中提供了直接通过http访问的方式
- 向http包的默认请求路由器注册了多个服务端点和处理函数
- 向http包的默认请求路由器注册了多个服务端点和处理函数
- 点击可以进行采集
- 如果没有使用http的默认请求路由,需要在新的路由器上注册端点
- 如果不是http程序,要单独启动一个用于性能数据采集的协程 总结:通过net/http/pprof包采集侵入小,代码独立,不用停止程序
1.1.3 数据分析
1.1.3.1 命令行交互
- 生成采集文件
- 使用go tool分析,可以看到运行时间和采集时间
- 使用top查看
- flat:函数代码在采用中的执行时长
- sum%:当前函数与其调用函数的总计百分比
- cum:当前函数与其等待的函数的总时长,所以越是调用栈底层的函数越大
可以通过list查看一个函数的各行执行时长
可以直接通过png命令生成png图
- 可以看到叶子节点的cum值比较大
- 也可以通过web命令用浏览器打开
1.1.3.2 web交互
go tool pprof -http=:9090 pprof_standalone1_cpu.prof
可以点击view查看各种形式
比如火焰图