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

相关推荐
10ms指针14 小时前
【高性能Go实践02】深水区重构:规避 sync.Pool 大对象缺陷与 Cgo 边界内存安全实践
go
鹏北海1 天前
Go 语言基础笔记 — 面向 JS/TS 前端开发者
go
鹏北海1 天前
Go 语言进阶笔记 — 面向 JS/TS 前端开发者
go
鹏北海1 天前
Go 包管理笔记 — 面向 JS/TS 前端开发者
go
百度Geek说1 天前
告别死锁和陈旧语法、告别性能瓶颈:新手Gopher 秒变 Go 语言大神
人工智能·go
用户398346161202 天前
Go-Spring 实战第 14 课 —— Bean 注册函数:Provide、Module、Group 以及 Configuration
spring·go
锋行天下2 天前
一句mysql复杂查询搞崩一个壮汉
后端·mysql·go
用户398346161203 天前
Go-Spring 实战第 13 课 —— Bean 元信息:名称、生命周期、接口导出、条件和显式依赖
spring·go
猪猪拆迁队3 天前
用 ESP32-S3 和 TinyGo,先搭个 AI 语音助手的小底座
前端·后端·go
赫媒派4 天前
炸裂!Go 1.26 三连发:go fix 现代化、pkg.go.dev API 开放、源码级内联器
go