golang之 pprof性能调优

pprof 性能调优

  在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。

说明:

  1. 希望知道应用在什么地方耗费了多少CPU、Memory
  2. 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

 

posted @   扛把子修BUG  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示