golang pprof 可视化图形查看及分析CPU性能


测试代码

package main

import (
	"bytes"
	"log"
	"math/rand"
	"net/http"
	_ "net/http/pprof"
	"time"
)

// 生成一个随机字符串
func genSomeBytes() *bytes.Buffer {
	var buff bytes.Buffer

	for i := 1; i < 20000; i++ {
		buff.Write([]byte{'0' + byte(rand.Intn(10))})
	}
	return &buff
}

func test() {
	log.Println(" ===> loop begin.")
	for i := 0; i < 1000; i++ {
		genSomeBytes()
	}

	log.Println(" ===> loop end.")
}

func main() {
	go func() {
		for {
			test()
			time.Sleep(time.Second * 1)
		}
	}()

	// 启动pprof
	http.ListenAndServe("0.0.0.0:9999", nil)
}

使用方法

1 go build main.go	->  main.exe(windows)  / main(linux)
2 执行程序 .\main.exe  /  ./main
2 http://127.0.0.1:9999/deBug/pprof/	等程序执行30s后,下载 profile 文件
3 go tool pprof .\main.exe(或者main) profile  输入web,得到svg格式的可视化文件

CPU利用率图形化

方块越大表示CPU的占用越大


常用操作

在终端使用 go tool pprof 命令生成和查看 pprof 文件

go tool pprof http://localhost:9999/debug/pprof/heap    # 查看内存使用情况
go tool pprof http://localhost:9999/debug/pprof/profile # 查看 CPU 使用情况

将这些信息保存为文件以供离线分析

curl -o heap.prof http://localhost:9999/debug/pprof/heap
curl -o cpu.prof http://localhost:9999/debug/pprof/profile?seconds=30
go tool pprof main heap.prof
go tool pprof main cpu.prof

常见的 pprof 分析命令
进入 pprof 交互式命令行界面后,可以使用以下命令进行分析:

  • top:显示 CPU 或内存消耗最多的函数,默认按消耗排序。

  • list <function_name>:查看指定函数的源码以及性能消耗信息。

  • web:以图形界面展示性能分析结果(需要安装 Graphviz)。

    安装graphviz
    Ubuntu
    sudo apt-get install graphviz
    Windows
    下载地址https://graphviz.gitlab.io/_pages/Download/Download_Windows.html
    将graphviz安装目录下的bin文件夹路添加到Path环境变量中,在终端输入dot --version命令查看是否安装成功

  • svg:生成 SVG 格式的分析图。

  • png:生成 PNG 格式的分析图。

分析 CPU 和内存的使用情况
在排查问题时,可以重点关注以下两方面:

  • CPU Profiler:用于分析 CPU 使用情况,帮助找到耗时较长的代码段。
  • Heap Profiler:用于分析内存使用情况,帮助找到内存泄漏和过高的内存使用问题。

常见性能瓶颈

  • CPU使用过高:检查是否有热点函数(CPU 消耗较高的函数),并尝试优化相关代码。
  • 内存泄漏:关注 heap 的 top 输出中是否有内存增长,或者某些数据结构未释放。
  • 阻塞操作:查看 goroutine 的 profile,检查是否存在锁竞争或通道阻塞问题。

【Go 开发】pprof 排查问题流程:排查程序 CPU 占用高的问题

posted @ 2024-12-18 09:22  guanyubo  阅读(85)  评论(0编辑  收藏  举报