pprof 对go语言进行性能分析
pprof 提供一个探针包,需要引入到被【检测程序 Main】 中,然后探针生成的文件,可以被pprof提供的分析工具读取分析。
注意:探针监控的指标越多,对 Main 的资源的占用会变多。
流程简要:
【探针包】
“runtime/pprof”
然后就是创建【剖析文件】
profile, _ := os.Create(“cpu_profile”)
cpu_profile 是剖析文件的自定义名称
启动 pprof 【剖析程序】,并产生文档到指定【剖析文件】
_ = pprof.StartCPUProfile(profile)
关闭【剖析程序】
defer pprof.StopCPUProfile()
使用【剖析文件解析器】,解析【剖析文件】
go tool pprof progname cpu_profile
总结
这里有四个概念:
- 探针包
- 剖析文件
- 剖析程序
- 剖析文件解析器
看名称就能知道概念的意思了。
监控项与指标:
监控项:
- cpu监控
各个函数的cpu占用率或者消耗的时长 (直接看flat参数)
- 堆内存开销监控
内存的分配量以及回收量,和堆内存各个对象的占用量
- 锁资源的阻塞监控
各个指令执行时阻塞开销时间,以及指令的位置
- 线程/协程的监控
各个函数的协程的数量以及比例。
监控项的意义
cpu可以了解代码算法的复杂度。
内存可以了解资源的占有,以及对象的分布。
锁可以了解运行时的业务交互细节,判断哪些交互逻辑不合理以及业务设计上的缺陷。
线程/协程的监控 可以了解运行时有哪些线程或者协程序在工作,以及他们在故障发生时所处的调用栈的位置。
【类比】我们把监控当作是侦探工作。
cpu监控可以让我们了解案发时间点和范围,以及初步定位案件性质是“他杀还是自杀”?(被抢了资源,还是自己用光了cpu资源)
内存可以让我们案发时,各个有关人员的不在场证明,以及案发时周围环境的分布,甚至我们可以从中找到作案工具后直接找到真相。
锁资源的阻塞情况可以让我们分析被害人案发前是否存在纠葛,帮助我们推断作案动机。
线程/协程的监控,可以帮助我们了解发现后各个涉事人员目前都在走什么,帮助我们快速对嫌疑人进行初步过滤,缩小凶手的排查范围。
【推广】 trace 与 pprof 的区别
trace 与 pprof 同样作为性能分析工具,用法都一样。
只是在展示数据的粒度不一样。
trace 的粒度更细,你可以按照 每一个请求流程的粒度去了解 cpu/内存/线程/锁资源 的消耗情况。
pprof 则是站在程序的角度,审视整个程序业务总量上的消耗情况。