Go语言pprof实战笔记(上) | 青训营

107 阅读4分钟

前言

要想作为一名优秀的程序员,除了会写代码,当然还要会排查分析一些问题。单元测试和基准测试只能作为第一道保证,真正出现问题的时候我们还需要一些手段来排查问题,这次我们来进行一场性能问题排查的实战

实战准备

我是项目地址
实战正式开始之前,我们需要从Github上获取一个用于练手的炸弹项目,本次实践也是基于项目附带的博客跟着做的。这个项目里面有非常多的性能炸弹,我们的任务就是利用pprof工具来找出这些炸弹。 由于项目里面有非常多的性能炸弹,所以运行这个项目还是要有一定前提的

  • 至少2核CPU
  • 至少2G运行内存
  • 能承受设备重启的后果(切勿运行在线上环境)

实战开始

我们直接使用cmd打开项目所在的文件夹,然后运行go build && go-pprof-parctice.exe就能运行起来这个项目。项目运行起来后稍等一分钟,如果你的运行设备依然没有任何的问题,那么我们可以继续下面的步骤了。

在浏览器输入http://localhost:6060/debug/pprof/并回车,你将看到这个界面 image.png 这个界面的几个超链接点进去就能看到各种采样信息,不过这些信息的可读性不高,所以我们需要借助go tool pprof命令来排查问题,这个命令直接就能使用,不需要额外安装什么软件或者依赖。

排查CPU占用过高

我们通过任务管理器看到CPU占用过高,这肯定是不正常的,所以接下来开始排查问题

image.png 在终端输入命令go tool pprof http://localhost:6060/debug/pprof/profile,等待一会后会出现一个交互式终端。需要注意的是,go tool pprof后面的链接不只是之前的链接,而是后面又多了一个/profile,这个propfile在浏览器的界面上有明确的说明。

  • profile:CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.
    概要文件:CPU概要文件。可以在seconds GET参数中指定持续时间。在获得概要文件之后,使用go tool pprof命令来研究概要文件。

其实就是因为概要文件的可读性比较差,所以需要使用pprof帮助我们来分析这个概要文件。 首先输入top命令来查看CPU占用较高的调用
image.png 这里简要说明一下各个指标的意思
flat:这是指在此函数中花费的 CPU 时间或分配的内存,不包括由此函数直接调用的其他函数的时间/内存。
flat% :这是 flat 的百分比,即在此函数中花费的 CPU 时间或分配的内存占总时间或总内存的百分比。
sum% :这是到目前为止遇到的 flat% 的累加。
cum:这是此函数以及它所有子函数花费的总 CPU 时间或分配的总内存,即使这些子函数是在其他函数中调用的。
cum% :这是 cum 的百分比,即此函数以及它所有子函数花费的 CPU 时间或分配的内存占总时间或总内存的百分比。

通过这次top命令的结果,我们可以看到CPU占用过高是由github.com/wolfogre/go-pprof-practice/animal/felidae/tiger.(*Tiger).Eat造成的。
接下来使用list Eat命令来查看问题到底在代码的哪个位置。 image.png 好家伙,一看吓一跳,代码作者居然在这里写了个100亿次的循环。那么问题定位已经完成了,接下来我们就去把代码注释了吧,这样就算是完成一次优化了(真简单呀,实际开发优化可不是这么简单,要是慢就把代码注释掉,迟早走人)

总结

好了,今天的性能优化就到这里吧。
下期预告:排查内存占用过高