golang之 pprof性能调优
pprof 性能调优
在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。
说明:
- 希望知道应用在什么地方耗费了多少CPU、Memory
- pprof是用于可视化和分析性能分析数据的工具
开启CPU性能分析:
pprof.StartCPUProfile(w io.Writer)
停止CPU性能分析:
pprof.StopCPUProfile()
内存性能优化
pprof.WriteHeapProfile(w io.Writer)
完整代码如下
package main import ( "flag" "fmt" "os" "runtime/pprof" "time" )
// 有问题的函数 func logicode(){ var c chan int for { select { case v := <- c:
// 永远也不走这条语句,因为chan没有初始化 获取的值都是nil 一直在循环 fmt.Printf("recv from chan, value: %v\n",v) default:
// 优化后的代码块减少cpu time.Sleep(time.Millisecond * 500) } } } func main() { // 是否开启CPUprofile 的标志为 var isCPUPprof bool // 是否开启memprofile 的标志位 var isMemPprof bool flag.BoolVar(&isCPUPprof,"cpu",false,"turn cpu pprof no") flag.BoolVar(&isMemPprof,"mem",false,"turn mem pprof no") flag.Parse() if isCPUPprof { //抓取cpu的使用情况保存到./cpu.ppro 文件中 cpufile , err := os.Create("./cpu.pprof") if err !=nil{ fmt.Printf("create cpu pprof failed err:%v\n",err) return } // 往文件中记录cpu profile 信息 pprof.StartCPUProfile(cpufile) defer func (){ pprof.StopCPUProfile() cpufile.Close() }() } for i :=0; i < 6; i++{ go logicode() } time.Sleep(20 * time.Second) if isMemPprof{ memfile ,err := os.Create("./mem.pprof") if err !=nil{ fmt.Printf("create mem pprof failed err:%v\n",err) return } pprof.WriteHeapProfile(memfile) defer func(){ memfile.Close() }() } }
执行操作,获取cpu使用保存到文件中
有两个参数 -cpu 、-mem 参数 使用bool 值默认是false
.\04pprof_demo.exe -cpu=true
使用go tool pprof 打开文件分析内容
//打开文件进入交互模式 go tool pprof .\cpu.pprof // top 4 查看程序中占用CPU前4个的函数 top 4
// 退出
quit
- flat: 当前函数占用CPU的耗时
- flat% : 当前函数占用CPU的耗时百分比
- sum%: 函数占用CPU的耗时累计百分比
- cum: 当前函数加上调用当前函数的函数占用CPU的总耗时
- cum*: 当前函数加上调用当前函数的函数占用CPU的总耗时百分比
- 最后一列: 函数名
查看函数占用CPU的情况
//查看具体函数并分析 list logicode
用图形工具
https://www.graphviz.org/download/
下载好之后在终端执行 dot --version 查看是否安装成功
go tool pprof .\cpu.pprof (pprof) web
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南