这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
pprof工具是什么?
在实际项目中,我们希望知道在什么地方耗费了多少CPU算力、内存开销,光是一个个数据不能直观得出结论,pprof可以将测试数据可视化反馈。
pprof工具组成
pprof其实也是一个代码项目,任何一个代码项目都是由不同组件组成的。
(图片来源:青训营内部课课件)
分析与展示
这部分不是讲的代码组成,而是表明pprof最终的测试结果是从网页反馈的(localhost搭建网页),数据在网页上有丰富图表显示。
左下方的<展示>部分,表明可视化的内容。由调用图,火焰图,源码,反汇编,Peek&Top几部分。
工具与采样
工具由runtime、net/http两部分组成。
采样程序运行时CPU、Heap、Goroutine、Mutex、Block、ThreadCreate的情况,几乎样样俱到。
如何使用pprof
在main.go上方import
注意,这里的import需要加下划线 _
import _ "net/http/pprof"
熟悉Go语法基础的都知道,我们在查询map里面是否有key存在时,可以用这种方法:
if _, ok := map[key]; ok{
// if exist,
// do something...
}
以此可见,_的作用是:忽略结果,因为Go语法不允许声明而未被使用的变量或者其他物件出现,但是如果真的出现了冗余成分,大可以用_来忽略。
那么为什么要在这里import的时候加_?
因为每一个导入的包都需要被使用,如果导入的包未被使用,Go编译器会报错。如果加上_,就可以让这个包成功被导入且不对其进行使用。
import的玄只因
其实每一个import的过程,对应的都有一个构造函数。
笔者一直把Go中的包理解为C++的一个类,在这里同样可以这么理解。在import的时候,Go会先去调用这个包的init函数,再对这个包展开其他方法的调用。
那么应用到这里,我们通过import _ "net/http/pprof",实际上调用了这个包的构造函数,这便足矣,已经完成了pprof的启动。
http://localhost:6060/debug/pprof
如果在本地启动了server,访问这个路由:/debug/pprof,即可访问pprof的性能测试网页端。
如图,我们已经成功进入了pprof性能可视化网页。
查看Goroutine有哪些
后续
有关pprof后续使用可以自行上网查找,此处不再描述~