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

相关推荐
FungLeo18 小时前
成为全栈·Go 后端篇·三轮代码审阅之后:把可读性和证据做成工程规则
golang·go·ast·静态检查·成为全栈·代码审阅
我不会起名字32221 小时前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
xyzzklk1 天前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
vipxieliang2 天前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
我不会起名字3223 天前
Redis 从 0 到 1(二十七):JSON 体积是 Protobuf 的 3.7 倍?3 种序列化的 Go 基准测试
redis·go·序列化·protobuf·messagepack
我不会起名字3223 天前
Redis 从 0 到 1(二十三):一个热 key 打到 10 万 QPS——hotkey 与本地缓存的 Go 实现
redis·缓存·go·qps·hotkey
Patrick_Wilson3 天前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
Patrick_Wilson3 天前
从文本输出理解 Go 方法与接口
后端·go·编程语言
Patrick_Wilson4 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
Patrick_Wilson4 天前
第一次读 Go 项目:从两个源码文件弄清 package、import 和 go.mod
后端·go·编程语言