如何在30秒内学会使用pprof分析Go

假设下面的代码是你要分析的 Go 代码:

package main

import (
    "fmt"
    "sync"
    "time"
)

// 模拟耗时操作
func hardWork(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Start: %v\n", time.Now())

    // 模拟耗内存
    a := []string{}
    for i := 0; i < 500000; i++ {
        a = append(a, "aaaa")
    }

    // 模拟阻塞操作
    time.Sleep(2 * time.Second)
    fmt.Printf("End: %v\n", time.Now())
}

func main() {
	// 启动一个协程来执行 hardWork,并且等待它执行完成
    var wg sync.WaitGroup
    wg.Add(1)
    go hardWork(&wg)
    wg.Wait()
}

现在我们通过 pprof 来对其进行分析,我们需要做如下步骤:

  1. 安装 graphviz,这可以让我们以图形的形式来展示分析结果。mac 下通过 brew install graphviz 来安装,windows 下的安装可以自行在 csdn 搜索一下
  2. 安装 pprof:go get -u github.com/google/pprof
  3. 在 Go 代码中添加导入:import _ "net/http/pprof"
  4. 添加 pprof 的 web 端口:
go func() {
  fmt.Println(http.ListenAndServe("localhost:6060", nil))
}()

最终代码是下面这样的:

package main

import (
    "fmt"
    "net/http"
    "sync"
    "time"

    _ "net/http/pprof"
)

// 模拟耗时操作
func hardWork(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Start: %v\n", time.Now())

    // 模拟耗内存
    a := []string{}
    for i := 0; i < 500000; i++ {
        a = append(a, "aaaa")
    }

    // 模拟阻塞操作
    time.Sleep(2 * time.Second)
    fmt.Printf("End: %v\n", time.Now())
}

func main() {
    var wg sync.WaitGroup

    // pprof 分析结果的界面
    go func() {
        fmt.Println(http.ListenAndServe("localhost:6060", nil))
    }()
	// 启动一个协程来执行 hardWork,并且等待它执行完成
    wg.Add(1) // 等待 pprof 协程
    wg.Add(1) // 等待 hardWork 完成
    go hardWork(&wg)
    wg.Wait()
}

接着,我们在控制台执行下面的命令:

go tool pprof http://localhost:6060/debug/pprof/heap

我们会进入一个交互式的命令行:

Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in /Users/ruby/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Type: inuse_space
Time: Jan 11, 2024 at 10:21am (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)   // 我们可以在这里输入不同的命令

接着,我们在这个交互式的命令行中输入 png,它就会在我们项目的根目录下生成了一个分析结果的图片(注意:需要安装 graphviz):

如何在30秒内学会使用pprof分析Go_第1张图片

另一种查看分析结果的方式

当然,命令行这种方式还是不太方便,我们可以直接打开浏览器访问:

http://localhost:6060/debug/pprof/

在这个页面,我们只需要通过鼠标点击就可以看到不同的性能指标了:

如何在30秒内学会使用pprof分析Go_第2张图片
在这里,我们可以很容易查看我们的 Go 程序的一些性能指标,比如:

  • 内存
  • 协程
  • 阻塞

你可能感兴趣的:(go,golang,开发语言,后端)