当前位置: 首页 > news >正文

golang性能分析之pprof

在 Go 语言中,使用 pprof 进行性能分析是优化代码的常用手段。以下简要介绍操作步骤:

1. 导入 pprof 包
在代码中导入 net/http/pprof 包(即使你不需要 HTTP 服务),它会自动注册性能分析相关的路由:

import (
    _ "net/http/pprof" // 自动注册 pprof 路由
    "net/http"
)

func main() {
    // 启动一个 HTTP 服务(用于 pprof 分析)
    go func() {
        http.ListenAndServe("localhost:6060", nil)
    }()

    // ... 你的业务代码 ...
}

2. 生成性能分析数据
通过 HTTP 接口获取数据
启动程序后,访问以下接口获取分析数据:

http://localhost:6060/debug/pprof/:所有可用的性能分析类型。

http://localhost:6060/debug/pprof/profile:CPU 分析(默认采集 30 秒)。

http://localhost:6060/debug/pprof/heap:内存分析。

http://localhost:6060/debug/pprof/block:阻塞分析。

http://localhost:6060/debug/pprof/goroutine:Goroutine 分析。

通过命令行直接采集

# 采集 CPU 数据(默认 30 秒)
go tool pprof http://localhost:6060/debug/pprof/profile

# 采集内存数据
go tool pprof http://localhost:6060/debug/pprof/heap

# 采集 60 秒 CPU 数据
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60

3. 分析性能数据
交互式命令行分析
运行命令后进入交互模式:

go tool pprof http://localhost:6060/debug/pprof/profile

常用命令:

top:显示耗时最多的函数。

list 函数名:查看具体函数的代码行耗时。

web:生成可视化调用图(需安装 Graphviz)。

svg:生成 SVG 格式的火焰图。

生成火焰图
安装 Graphviz:

# macOS
brew install graphviz

# Ubuntu/Debian
apt-get install graphviz

生成火焰图:


go tool pprof -http=:8080 pprof.profile

浏览器打开 http://localhost:8080,选择 Flame Graph 查看。

4. 代码中手动采集数据
如果不使用 HTTP 服务,可以手动生成分析文件:

import (
    "os"
    "runtime/pprof"
)

func main() {
    // CPU 分析
    f, _ := os.Create("cpu.pprof")
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()

    // ... 你的代码 ...

    // 内存分析
    mf, _ := os.Create("mem.pprof")
    pprof.WriteHeapProfile(mf)
    defer mf.Close()
}

5. 分析 Benchmark 性能
在测试文件中结合 testing 和 pprof:

func BenchmarkMyFunc(b *testing.B) {
    // 启动 CPU 分析
    f, _ := os.Create("benchmark_cpu.pprof")
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()

    // 运行被测函数
    for i := 0; i < b.N; i++ {
        MyFunc()
    }
}

运行 Benchmark 并生成分析文件:


go test -bench=. -cpuprofile=benchmark_cpu.pprof
go tool pprof benchmark_cpu.pprof
  1. 常见分析场景
    CPU 瓶颈:查看 top 列表,优化高耗时函数。

内存泄漏:分析 heap,检查未释放的内存分配。

Goroutine 泄漏:通过 goroutine 分析,找到未退出的 Goroutine。

阻塞分析:使用 block 类型,查找程序阻塞点。

示例:分析 HTTP 服务
启动一个 HTTP 服务并导入 pprof。

使用压测工具(如 wrk 或 ab)模拟请求。

采集 CPU 或内存数据:


go tool pprof http://localhost:6060/debug/pprof/profile

分析火焰图,找到热点函数。

通过以上步骤,你可以快速定位 Go 程序的性能瓶颈并进行优化。实践中建议结合火焰图和代码逻辑进行深度分析。

相关文章:

  • 2025年信息科学与工程学院科协机器学习介绍——conda环境配置
  • TypeScript 类型断言的适用场景及代码示例
  • 手撕跳表/数据结构
  • EasyExcel 实践案例:打印工资条
  • 一周学会Flask3 Python Web开发-Jinja2模板访问对象
  • w226经方药食两用服务平台的设计与实现
  • C++ 中的继承详解(上)
  • Spring DIIoC
  • JVM层面的JAVA类和实例(Klass-OOP)
  • 计算机毕业设计程序,定制开发服务
  • .manifest是什么文件格式
  • Docker 搭建 MySQL 数据库
  • 代码随想录算法训练营第四十八天| 动态规划10
  • c#丰田PLC ToyoPuc TCP协议快速读写 to c# Toyota PLC ToyoPuc读写
  • 在大数据项目中如何设计和优化数据模型
  • 力扣-贪心-56 合并区间
  • UIAutomation开发常用方法的参考文档
  • blender bpy渲染禁用日志
  • 尚硅谷爬虫note12
  • 【Electron入门】进程环境和隔离
  • 嘉兴免费做网站/第三方网络营销平台有哪些
  • 卡盟做网站/网址怎么推广
  • 怎样销售网站/seo关键词外包
  • 网站测试毕设代做/百度网址大全电脑版
  • 高中信息技术网站设计规划/快速网站推广优化
  • wordpress显示代码/aso优化重要吗