高质量编程与性能调优实战 | 青训营

82 阅读3分钟

前言

在编写代码过程中想知道应用在什么地方耗费了多少CPU、Memory,这时候我们想到pprof工具,这个玩意是用于可视化和分析性能分析数据的工具,本文是在使用pprof工具产生的一些想法和一些操作步骤。

框架

屏幕截图 2023-08-05 160347.png 我在想写个文章而已这也能触犯到版权,况且这还是我自己写的文章,怎么做到秒加载水印的,算了不管了,继续码字~~~ 上图看到的就是关于pprof工具的一个大体的框架,没想到一个小小的工具还能有这么多花样,接下来就跟着这些步骤一步步来实践吧。

排查实战

搭建pprof实践项目

这次我是采用了github的代码来进行实践操作,项目提前埋入了一些炸弹代码,产生可观测一些性能问题

前置准备

  • 下载项目代码,能够编译运行
  • 会占用1CPU核心和超过1GB的内存

正式开始

  • 浏览器查看指标

2.png

这里我们可以看到allocs(CPU)有12个,block(阻塞)有3个,goroutine(协程)有54个,heap(堆内存)有12个,mutex(锁)有1个,Thread Create(线程创建)有7个,接下来我们可以通过不同的可视化方法来就进行排查代码的错误。

首先上面就是第一种方法就是监听本地端口,在浏览器中查看这些指标的信息。

CPU

通过运行这块代码,然后在任务管理器中查看CPU的占用情况,发现这个程序直接占用了一半以上

在pprof工具中利用web命令调用关系可视化,发现tiger中的Eat占用最多,所以我们使用list加上正则表达式,搜索出有关的这一部分代码,然后将其删除掉。

image.png

就上图来看这个循环非常占用CPU,然而这个循环里面根本没做什么东西。

Heap

还是通过以上方法进行排查堆内存的问题,在浏览器的可视化试图可以轻松切换各个界面,最常用的是Top和Source界面,这两个可以很明朗地看出问题所在,并且及时解决问题

image.png

比如我们这里是dog中的Run方法导致追朔其源代码,发现一直在申请空间,所以我们这里把这行代码注释掉,在查看一下任务管理器发现内存降下来了

goroutine

然后我们介绍一个新的方法,火焰图,顾名思义就是一个火焰的样子,

  • 由上到下表示调用顺序

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

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

image.png

这样的UI给人一种清晰明了的感觉,程序的结构也一目了然,更容易排查之中的错误

block

在实践中发现两个block,有一个block操作在top中不显示,最后一通排查下发现这是有用的代码,就是在排查调优的过程中不要统统都按错误处理了,有些是重要的代码。

小结

这次实践相当于认识了GO语言的性能分析工具--pprof,原谅我还不怎么会用Md写文章,一些花里胡哨的东西还没学会,所以只能寒酸的写了些。