golang性能分析之pprof

news/2025/2/25 21:44:36

在 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 程序的性能瓶颈并进行优化。实践中建议结合火焰图和代码逻辑进行深度分析。


http://www.niftyadmin.cn/n/5865968.html

相关文章

steam_api.dll丢失3分钟修复指南,解决Steam游戏无法运行

你是不是刚下载好 Steam 游戏&#xff0c;激动双击图标&#xff0c;结果弹出一句 “steam_api.dll 没有被指定在 windows 上运行”&#xff1f;本文提供 3 种安全修复方案&#xff0c;详解 steam_api.dll 文件下载避坑技巧 正确存放路径&#xff0c;推荐一键修复工具&#xff…

体育数据系统是怎么开发的

体育数据系统的开发通常包括多个环节&#xff0c;涉及数据采集、处理、存储和展示等方面。下面是开发一个体育数据系统的主要步骤&#xff1a; 1. 需求分析与规划 确定目标&#xff1a;明确系统的目标&#xff0c;比如实时比赛数据跟踪、球员统计、比赛分析等。 确定用户群体…

CSS实现图片缺角效果

效果&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>123</title…

力扣2382. 删除操作后的最大子段和

力扣2382. 删除操作后的最大子段和 题目 题目解析及思路 题目要求找到每次删除一个元素的最大字段和 因为删除不好做&#xff0c;可以转删除为添加&#xff0c;用并查集维护当前子段和 两部分合并(两个并查集)&#xff0c;三部分求和(两个并查集和一个元素) 代码 class S…

【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读

Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…

SpringBoot两种方式接入DeepSeek

方式一&#xff1a;基于HttpClient 步骤 1&#xff1a;准备工作 获取 DeepSeek API 密钥&#xff1a;访问 DeepSeek 的开发者平台&#xff0c;注册并获取 API 密钥。 步骤 2&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId&g…

20250212:https通信

1:防止DNS劫持:使用 https 进行通信。 因为是SDK授权开发,需要尽量压缩so库文件和三方依赖。所以第一想法是使用 head only 的 cpp-httplib 进行开发。 cpp-httplib 需要 SSL 版本是 3.0及以上。但本地已经在开发使用的是1.0.2a版本,不满足需求。 方案1:升级OpenSSL 将Op…

Lab14_ Blind SQL injection with time delays

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 带有时间延迟的 SQL 盲注 等级&#xff1a;执业者 简介&#xff1a; 本实验室包含一个盲 SQL 注入漏洞。应用程序使用跟踪 cookie 进行分析&#xff0c;并执行包含已提交 coo…