这是我参与「第五届青训营」伴学笔记创作活动的第 14 天
本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新
基础理解
简单介绍测试和 pprof 的作用
软件测试是软件开发完以后对软件各方面性能测试,以便于排查软件的问题,开发后期对软件进行优化
而 pporf 的作用就是快速在 Golang 的项目钟生成一些测试报告来方便地进行测试
它支持三种使用方法:
- Web 界面
- 交互式终端
- 可视化界面
只说指令很空,快速过一个简单的例子是更好的做法
简单的测试步骤
- 直接跑第一个参考资料里的一个程序(分别在某段代码藏有高占用的问题
- 因为我们的代码中导入了 PPROF 的相关包和相关代码,因此我们可以直接另开终端运行其注册的测试服务器
- 一个简单办法是通过
go tool pprof http://localhost:6060/debug/pprof/profile进入 CPU 占用分析 - 然后分别通过 top 和 list 命令找出占用高的函数和代码段,简单理解的重点是暂时不要考虑细节,可以把那些内容简单考虑成越大占用越高
如何将 pporf 加入自己的项目
有两种运行方式
- 一种是用 pprof 去分析我们测试出来的结果文件
- 另一种方式是直接在运行时进行分析
首先是如何获得结果文件
这是一个获取 cpu profiling 的实例
import (
"os"
"runtime/pprof"
)
func main() {
f, err := os.Create("cpu.pprof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
err = pprof.StartCPUProfile(f)
if err != nil {
log.Fatal(err)
}
defer pprof.StopCPUProfile()
// Your application code here
}
然后是运行时常用的在软件运行的 时候设置一个服务器来测试
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// Your application code here
}
这两种方法甚至可以结合使用
测试生成结果的理解
- cum: 表示当前函数 + 调用的所有函数的占用
- flat: 表示当前函数本身的耗时
参考资料
-
比较完整的教程,具体报告的说明比较详细(还有一部分测试内容没看完) golang pprof 实战 | Wolfogre's Blog
-
有简单介绍所有操作的用法 blog/2018-09-15-go-tool-pprof.md at master · eddycjy/blog