GO语言性能分析工具简单了解| 青训营笔记

117 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第三篇笔记

看到标题你可能就知道我这篇文章要说什么了。 没错,它就是pprof

在青训营的课程中由抖音服务架构的张雷老师进行讲解,在经过学习后我初步认识到了性能测试与调优的重要性,在之前的经历中,由于项目流量不大,其实很少去进行性能方面的考虑,而经过学习,也是知道了很多知识点。下面就来简单梳理一下pprof:

pprof是一款GoLang程序性能分析工具,其中的prof是profile(画像)的缩写,用pprof我们最常去分析的是下面四种数据:

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

它支持三种模式:

  • Report generation:报告生成
  • Interactive terminal use:交互式终端使用
  • Web interface:Web 界面 下面来进行一个简单的使用:
 "net/http"
    _ "net/http/pprof"

第一步当然是导入,接下来我们在代码运行的地方写上


go func() {
   log.Println(http.ListenAndServe(":8888", nil))
}()

接着,我们访问http://127.0.0.1:8888/debug/pprof/,即可看到 完整demo:

image.png

那其中一些我们比较关注的信息就是这些:

  • allocs:查看过去所有内存分配的样本。
  • block:查看导致阻塞同步的堆栈跟踪。
  • cmdline: 当前程序的命令行的完整调用路径。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪。
  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。
  • threadcreate:查看创建新 OS 线程的堆栈跟踪。

下面是一个完整的demo

package main

import (
    "log"
    "net/http"
    _ "net/http/pprof"
)


var datas []string

func Add(str string) string {
    data := []byte(str)
    sData := string(data)
    datas = append(datas, sData)
    return sData
}

func main() {
    go func() {
        for {
            log.Println(data.Add("https://github.com/EDDYCJY"))
        }
    }()

    http.ListenAndServe("0.0.0.0:8888", nil)
}

运行之后你的 HTTP 服务会多出 /debug/pprof 的 endpoint 可用于观察应用程序的情况