【后端开发】字节跳动青训营之性能分析工具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 大法进行错误定位。

相关推荐
stark张宇15 小时前
Go语言核心三剑客:数组、切片与结构体使用指南
后端·go
Aevget15 小时前
智能高效Go开发工具GoLand v2025.3全新上线——新增资源泄漏分析
开发语言·ide·后端·golang·go
wwz161 天前
Dagor —— 一个高性能 DAG 算子执行框架,开箱即用!
go
源代码•宸1 天前
goframe框架签到系统项目开发(补签逻辑实现、编写Lua脚本实现断签提醒功能、简历示例)
数据库·后端·中间件·go·lua·跨域·refreshtoken
光头闪亮亮2 天前
Go语言开发的命令行MP3播放器
go
Grassto2 天前
Go Module 的版本选择算法:Minimal Version Selection(MVS)
后端·golang·go·go module
汪小成2 天前
Go CLI 入口设计:参数解析、错误处理与项目分层实战
后端·go
gitboyzcf3 天前
Go(GoLang)语言基础、知识速查
后端·go
汪小成3 天前
Go 项目结构总是写乱?这个 50 行代码的 Demo 教你标准姿势
后端·go
littleschemer4 天前
go结构体扫描
游戏·go·解析·struct