【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof

资料链接:

  1. 项目代码链接
  2. 实验指南
  3. pprof使用指南

一、测试程序介绍

go 复制代码
package main

import (
	"log"
	"net/http"
	_ "net/http/pprof" // 自动注册handler到http server, 方便通过http接口获取程序运行采样报告
	"os"
	"runtime"
	"time"

	"github.com/wolfogre/go-pprof-practice/animal"
)

func main() {
	log.SetFlags(log.Lshortfile | log.LstdFlags)
	log.SetOutput(os.Stdout)

	runtime.GOMAXPROCS(1) // 限制CPU使用数,避免过载
	runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪
	runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪

	go func() {
		// 启动讴歌http server, 注意pprof相关的handler已经自动注册过了
		if err := http.ListenAndServe(":6060", nil); err != nil {
			log.Fatal(err)
		}
		os.Exit(0)
	}()

	for {
		for _, v := range animal.AllAnimals {
			v.Live()
		}
		time.Sleep(time.Second)
	}
}

二、pprof工具安装与使用

2.1 pprof工具安装

首先安装pprof工具:

bash 复制代码
go get -d github.com/wolfogre/go-pprof-practice
cd /Path to go-pprof-practice
go build

上述步骤将pprof编译成能够直接在windows系统中直接运行的.exe程序。

之后直接使用下述命令即可启动:

bash 复制代码
./go-pprof-practice

2.2 pprof工具使用

  • 基本服务类型:
类型 描述 备注
allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高
blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高
cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice
goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高
heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高
mutex 锁争用情况的采样信息 可以用浏览器打开,但可读性不高
profile CPU 占用情况的采样信息 浏览器打开会下载文件
threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高
trace 程序运行跟踪信息 浏览器打开会下载文件,本文不涉及,可另行参阅《深入浅出 Go trace》

具体后缀根据实际情况从上述类型中确定,这里以CPU的profile为例

  1. 调出交互式界面()
bash 复制代码
go tool pprof http://localhost:6060/debug/pprof/profile
  1. top命令查看cpu使用情况

  2. list定位使用量高的代码位置(在本例中就是Eat程序)

    检查发现是这里的循环程序对CPU需求量较大,定位到代码的第24行

  3. web命令可视化

    注!针对其他的方法同样使用 top list web 大法进行错误定位。

相关推荐
讲不出 再见7 小时前
go语言-指针
go·指针
讲不出 再见16 小时前
go语言-包
golang·go·package··包冲突
王中阳Go2 天前
用Go写AI Agent:我从实战图书里总结了这些核心逻辑
后端·go·ai编程
扉页的墨3 天前
Go 错误处理之道:别再到处 return fmt.Errorf 了,你的代码正在失控
go
止语Lab3 天前
你写的Go代码,编译器能"看懂"多少
go
刀法如飞4 天前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
AI编程探险者5 天前
Go 编译的二进制突然跑不起来了?凶手是 macOS 的 syspolicyd
go
用户398346161205 天前
10 个示例快速入门 Go-Spring|v1.3.0 正式发布
go
zhouwy1136 天前
Golang 基础与实战笔记:从语法到微服务的全面指南
开发语言·go
日火7 天前
Go:实现基于mutex的环形缓冲区
go