• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Go使用pprof进行CPU,内存和阻塞情况分析

    发布者: 皮3591 | 发布时间: 2025-8-14 07:37| 查看数: 104| 评论数: 0|帖子模式

    Go 语言提供了强大的 pprof(Performance Profiler) 工具,用于分析 CPU、内存、Goroutine 阻塞 等性能问题,帮助开发者优化程序,提高运行效率。
    本文将深入解析
    1. pprof
    复制代码
    的核心功能、使用方式,并提供实际案例,掌握 Go 性能分析的技巧。

    1. pprof 介绍
    1. pprof
    复制代码
    是 Go 运行时内置的性能分析工具,可用于检测:

    • CPU 使用情况(找出 CPU 密集型代码)
    • 内存分配(定位高内存占用的热点代码)
    • Goroutine 阻塞情况(分析锁争用、死锁)
    • Heap 内存泄漏(分析堆分配情况)
    1. pprof
    复制代码
    依赖
    1. net/http/pprof
    复制代码
    ,可以通过 HTTP 访问运行中的程序,收集并分析性能数据。

    2. 快速上手:启用 pprof

    在 Web 服务器中启用 pprof
    添加
    1. net/http/pprof
    复制代码
    以暴露 pprof HTTP 接口:
    1. package main

    2. import (
    3.     "log"
    4.     "net/http"
    5.     _ "net/http/pprof" // 导入 pprof,自动注册路由
    6. )

    7. func main() {
    8.     go func() {
    9.         log.Println(http.ListenAndServe("localhost:6060", nil))
    10.     }()

    11.     select {} // 阻止主协程退出
    12. }
    复制代码
    运行程序后,可以使用以下命令访问
    1. pprof
    复制代码
    数据:
    1. # 访问 CPU Profiling 数据
    2. curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.prof

    3. # 访问内存 Profiling 数据
    4. curl http://localhost:6060/debug/pprof/heap > mem.prof
    复制代码
    3. CPU Profiling:分析 CPU 使用率

    CPU Profiling 记录程序执行过程中 每个函数的 CPU 使用情况,帮助识别性能瓶颈。

    3.1 代码示例
    1. package main

    2. import (
    3.     "log"
    4.     "os"
    5.     "runtime/pprof"
    6.     "time"
    7. )

    8. func busyWork() {
    9.     for i := 0; i < 1e7; i++ {
    10.     }
    11. }

    12. func main() {
    13.     f, err := os.Create("cpu.prof")
    14.     if err != nil {
    15.         log.Fatal(err)
    16.     }
    17.     defer f.Close()

    18.     pprof.StartCPUProfile(f)
    19.     defer pprof.StopCPUProfile()

    20.     busyWork() // 运行 CPU 密集型任务
    21. }
    复制代码
    3.2 使用 go tool pprof 分析
    1. # 运行 CPU Profiling
    2. go run main.go

    3. # 使用 pprof 分析 CPU 性能
    4. go tool pprof cpu.prof

    5. # 交互模式中输入 top,查看 CPU 占用最高的函数
    6. (pprof) top
    复制代码
    1. top
    复制代码
    命令显示 占用 CPU 时间最多的函数,帮助识别性能瓶颈。

    4. 内存 Profiling:分析内存分配情况

    Heap Profiling 主要用于检测 高内存占用和内存泄漏

    4.1 代码示例
    1. package main

    2. import (
    3.     "log"
    4.     "os"
    5.     "runtime/pprof"
    6. )

    7. func allocateMemory() {
    8.     _ = make([]byte, 10<<20) // 分配 10MB 内存
    9. }

    10. func main() {
    11.     f, err := os.Create("mem.prof")
    12.     if err != nil {
    13.         log.Fatal(err)
    14.     }
    15.     defer f.Close()

    16.     allocateMemory()
    17.     pprof.WriteHeapProfile(f) // 记录堆内存信息
    18. }
    复制代码
    4.2 使用 go tool pprof 分析
    1. # 运行程序并生成 mem.prof
    2. go run main.go

    3. # 分析内存使用情况
    4. go tool pprof mem.prof

    5. # 交互模式下输入 top,查看内存占用最多的函数
    6. (pprof) top
    复制代码
    5. 阻塞 Profiling:分析 Goroutine 阻塞情况

    Go 1.9 之后,
    1. pprof
    复制代码
    提供了 阻塞 Profiling,用于检测 Goroutine 的 锁竞争阻塞原因

    5.1 代码示例
    1. package main

    2. import (
    3.     "fmt"
    4.     "sync"
    5.     "time"
    6. )

    7. var mu sync.Mutex

    8. func worker(id int) {
    9.     mu.Lock()
    10.     defer mu.Unlock()
    11.     fmt.Printf("Worker %d is working\n", id)
    12.     time.Sleep(time.Second)
    13. }

    14. func main() {
    15.     for i := 0; i < 5; i++ {
    16.         go worker(i)
    17.     }
    18.     time.Sleep(3 * time.Second)
    19. }
    复制代码
    5.2 分析阻塞情况
    1. # 运行程序,并访问阻塞分析数据
    2. curl http://localhost:6060/debug/pprof/block > block.prof

    3. # 使用 pprof 工具分析
    4. go tool pprof block.prof

    5. (pprof) top
    复制代码
    1. top
    复制代码
    命令显示 导致 Goroutine 阻塞的函数,帮助优化锁竞争问题。

    6. 可视化 pprof 数据
    1. pprof
    复制代码
    生成的
    1. .prof
    复制代码
    文件可以使用 图形化工具 进行可视化分析。

    6.1 安装 graphviz
    1. # Ubuntu
    2. sudo apt-get install graphviz

    3. # macOS
    4. brew install graphviz
    复制代码
    6.2 生成 SVG 可视化报告
    1. # 生成 SVG 格式的调用图
    2. pprof -svg cpu.prof > cpu.svg
    复制代码
    然后使用浏览器打开
    1. cpu.svg
    复制代码
    ,查看调用关系。

    7. 结论

    Go
    1. pprof
    复制代码
    是一个强大的性能分析工具,可以帮助开发者深入分析 CPU、内存、Goroutine 阻塞 等问题。掌握
    1. pprof
    复制代码
    ,你可以:

    • 找出 CPU 性能瓶颈,优化计算密集型任务。
    • 分析内存分配,减少 GC 负担,优化内存占用。
    • 检测 Goroutine 阻塞,减少锁竞争,提高并发性能。
    • 通过可视化工具直观分析程序性能。
    利用
    1. pprof
    复制代码
    ,可以让 Go 程序运行得更加高效,避免潜在的性能问题!
    到此这篇关于Go使用pprof进行CPU,内存和阻塞情况分析的文章就介绍到这了,更多相关Go pprof性能分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表