以go语言为例类比侦探推理来讲解【性能分析】

本文介绍了如何利用pprof对Go语言程序进行性能监控,包括CPU、内存、锁和线程的监控。pprof通过探针包插入Main程序,生成剖析文件,然后使用分析工具解析,帮助开发者理解代码复杂度、资源占用和业务交互问题。监控项如CPU占用率、内存分配等提供了深入程序运行的洞察。同时,文章对比了pprof和trace在粒度上的区别,前者关注整体程序,后者关注每个请求的细节。

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 则是站在程序的角度,审视整个程序业务总量上的消耗情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值