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

相关推荐
我不会起名字32213 小时前
微服务链路超时怎么设:逐层收敛的 4 条规则与 1 个反例
微服务·go·超时·熔断
我的div丢了肿么办19 小时前
go语言安装包详细讲解
后端·go
我不会起名字32220 小时前
Go 写 Kafka 消费者:sarama 的 3 个坑与优雅退出写法
kafka·消息队列·go·sarama
我不会起名字32221 小时前
Redis 从 0 到 1(十一):缓存穿透/击穿/雪崩三连击,Go 3 套防御代码
redis·缓存·go·布隆过滤器·雪崩
bug菌1 天前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
tachibana22 天前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
Linux实战笔记2 天前
sync.Mutex还是Channel?Go并发场景选型对比与goroutine泄漏实战
go·channel·sync.mutex·goroutine泄漏·race detector
wflynn2 天前
GitHub 今日推荐|open_scion:为AI代理设计的并发版本控制
git·开源·go·github·agent·coding-agents
Thinker QAQ2 天前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
茉莉玫瑰花茶3 天前
GO [ 标准库 · unsafe ]
后端·go