Go 性能调优实战之pprof的使用丨青训营笔记

98 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 14 天

本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新

基础理解

简单介绍测试和 pprof 的作用

软件测试是软件开发完以后对软件各方面性能测试,以便于排查软件的问题,开发后期对软件进行优化

而 pporf 的作用就是快速在 Golang 的项目钟生成一些测试报告来方便地进行测试

它支持三种使用方法:

  • Web 界面
  • 交互式终端
  • 可视化界面

只说指令很空,快速过一个简单的例子是更好的做法

简单的测试步骤

  1. 直接跑第一个参考资料里的一个程序(分别在某段代码藏有高占用的问题
  2. 因为我们的代码中导入了 PPROF 的相关包和相关代码,因此我们可以直接另开终端运行其注册的测试服务器
  3. 一个简单办法是通过 go tool pprof http://localhost:6060/debug/pprof/profile 进入 CPU 占用分析
  4. 然后分别通过 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: 表示当前函数本身的耗时

参考资料