网站首页 > 文章精选 正文
pprof是一个go程序性能分析工具,可以用于分析go程序的CPU使用率、内存使用情况等
项目中如何使用pprof
package main
import (
"log"
"net/http"
_ "net/http/pprof" //初始化包
"os"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1) //设置只使用1个cpu
runtime.SetBlockProfileRate(1) //开启对阻塞的追踪
runtime.SetMutexProfileFraction(1) //开启对锁的追踪
go func() {
//启动一个http.server
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
//测试用
for { }
}
使用pprof
使用 go build 进行构建
浏览器打开
http://localhost:8080/debug/pprof/,即可看到如下页面
指标说明:
allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高
blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高
cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice
goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高
heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高
mutex 锁争用情况的采样信息 可以用浏览器打开,但可读性不高
profile CPU 占用情况的采样信息 浏览器打开会下载文件
threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高
trace 程序运行跟踪信息 浏览器打开会下载文件
用法一: 排查CPU占用过高
//命令
go tool pprof http://localhost:6060/debug/pprof/profile
//再输入 top
//再输入 list 标识名 即可查询到相关详细信息,如下图显示,可以找到哪里占用cpu比较高,可以看到,
//这里有一个大循环,是占用大量cpu的,
用法二: 排查占用内存过高
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/heap
//2. top
//3. list 对象名
用法三: 排查频繁内存回收
通过如下命令 GODEBUG=gctrace=1 ./main | grep gc 可以查看到程序的内存回收情况
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/allocs
//2. top
//3. list 对象名
用法四: 排查协程泄露
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/goruntine
//2. top
//3. list 对象名
用法五: 排查锁的争用
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/mutex
//2. top
//3. list 对象名
用法六: 排查阻塞的情况
//命令一样,只不过 list的对象名不同而已
//1. go tool pprof http://localhost:6060/debug/pprof/block
//2. top
//3. list 对象名
结语:
其实还有 火焰图等相关知识,但是本次遇到的bug,没有用到,这里就不写了,感兴趣的小伙伴,可以自己查资料哈
猜你喜欢
- 2025-07-08 Rust编程语言之父都在用什么工具(rust编程语言怎么样)
- 2025-07-08 爱上开源之golang入门至实战第三章-内存逃逸
- 2025-07-08 GO 编程:Golang的协程调度器原理及GMP设计思想
- 2025-07-08 Go语言核心36讲(新年彩蛋)--学习笔记
- 2025-07-08 c语言中堆和栈的区别(c语言堆和栈的概念和区别)
- 2025-07-08 Go 语言内存管理(一):系统内存管理
- 2025-07-08 深入解读Raft算法与etcd工程实现(etcd raft库原理)
- 2025-07-08 Go语言中的性能考虑和优化(go语言的效率)
- 2025-07-08 高性能 Go 的 6 个技巧 — Go 高级主题
- 2025-07-08 脚上的可穿戴产品,总有一款是你的菜
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)