性能分析工具 pprof | 青训营笔记

139 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

说明

  • 希望知道应用在什么地方耗费了多少 CPU、Memorypprof 是用于可视化和分析性能分析数据的工具

搭建 pprof 实践项目

  • GitHub (来自 Wolfogre ) github.com/wolfogre/go…

  • 项目提前埋入了一些炸弹代码,产生可观测的性能问题

  • allocs:内存分配情况

  • blocks:阻塞操作情况

  • cmdline:程序启动命令及

  • goroutine:当前所有goroutine的堆栈信息

  • heap:堆上内存使用情况(同alloc)

  • mutex:锁竞争操作情况

  • profile: CPU占用情况

  • threadcreate:当前所有创建的系统线程的堆栈信息

  • trace:程序运行跟踪信息

CPU

  • 命令: topN

  • 查看占用资源最多的函数

  • Flat == Cum,函数中没有调用其他函数

  • Flat == 0,函数中只有其他函数的调用

命令: list

  • 根据指定的正则表达式查找代码行

命令: web

  • 调用关系可视化

Heap-堆内存

  • go tool pprof -http=:8080'http://localhost:6060/debug/pprof/heap

  • alloc objects: 程序累计申请的对象数

  • alloc space: 程序累计申请的内存大小

  • inuse objects: 程序当前持有的对象数

  • inuse space: 程序当前占用的内存大小

goroutine-协程

  • goroutine泄露也会导致内存泄露

goroutine-协程

  • go tool pprof -http=:8080http://localhost:6060/debug/pprof/goroutine

  • 由上到下表示调用顺序

  • 每一块代表一个函数,越长代表占用 CPU 的时间更长

  • 火焰图是动态的,支持点击块进行分析

  • 支持搜索,在 Source 视图下搜索 wolf

mutex-锁

block-阻塞

性能分析工具 pprof-采样过程和原理

CPU
  • 采样对象: 函数调用和它们占用的时间
  • 采样率: 100次/秒,固定值
  • 采样时间: 从手动启动到手动结束
操作系统
  • 每10ms向进程发送一次SIGPROF信号
进程

每次接收到SIGPROF会记录调用堆栈

写缓冲

每100ms读取已经记录的调用栈并写入输出流

Heap-堆内存

  • 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
  • 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
  • 采样时间:从程序运行开始到采样时
  • 采样指标: alloc space,alloc objects,inuse _space,inuse_objects
  • 计算方式: inuse = alloc - free