pprof性能分析

[toc]

写在前面

pprof(性能剖析工具)是 Go 语言标准库中用于性能分析的工具。它可以帮助你了解程序在 CPU 和内存方面的性能表现,以便优化代码。使用 pprof,你可以获取 CPU 使用率、内存分配情况、阻塞情况等信息,并生成分析报告。

快速使用

使用步骤

pprof 的使用主要分为两个步骤:收集性能数据和生成分析报告。

  1. 收集性能数据:

首先,在你的 Go 代码中导入 net/http/pprof 包,并在程序中启动一个 HTTP 服务器,以便能够通过 HTTP 接口来获取性能数据。

package main

import (
    _ "net/http/pprof"
    "net/http"
)

func main() {
    // 启动 HTTP 服务器,监听在 6060 端口
    go func() {
        http.ListenAndServe("localhost:6060", nil)
    }()

    // ... 其他代码 ...
}
  1. 生成分析报告:

在程序运行时,你可以通过访问特定的 URL 来获取性能数据,然后使用 pprof 工具生成分析报告。

  • 获取 CPU 使用率数据:

在浏览器中访问 localhost:6060/debug/pprof/profile,该 URL 会运行 CPU 使用率分析,运行一段时间后,下载 .pb.gz 文件,然后使用 go tool pprof 命令来查看报告。

bashCopy code
go tool pprof http://localhost:6060/debug/pprof/profile
  • 获取内存分配数据:

在浏览器中访问 localhost:6060/debug/pprof/heap,该 URL 会运行内存分配分析,然后下载 .pb.gz 文件,并使用 go tool pprof 命令来查看报告。

bashCopy code
go tool pprof http://localhost:6060/debug/pprof/heap

以上是基本用法,pprof 还支持更多的性能分析功能,如阻塞分析、goroutine 分析等。你可以通过访问 localhost:6060/debug/pprof 来获取所有支持的性能分析功能列表,并按需生成相应的报告。

注意:在生产环境中,建议避免将 pprof 暴露在公开的网络上,因为它可能泄漏敏感信息。在生产环境中,可以使用类似 net/http/pprof 提供的 mux 来进行路由管理,并通过安全手段限制访问。

参数分析

类型 描述 备注
allocs 内存分配情况的采样信息 可以用浏览器打开,但可读性不高
blocks 阻塞操作情况的采样信息 可以用浏览器打开,但可读性不高
cmdline 显示程序启动命令及参数 可以用浏览器打开,这里会显示 ./go-pprof-practice
goroutine 当前所有协程的堆栈信息 可以用浏览器打开,但可读性不高
heap 堆上内存使用情况的采样信息 可以用浏览器打开,但可读性不高
mutex 锁争用情况的采样信息 可以用浏览器打开,但可读性不高
profile CPU 占用情况的采样信息 浏览器打开会下载文件
threadcreate 系统线程创建情况的采样信息 可以用浏览器打开,但可读性不高
trace 程序运行跟踪信息 浏览器打开会下载文件,本文不涉及
  1. flat:代表“平均”,表示对应函数的执行时间或者内存占用量。

  2. flat%:代表“平均百分比”,表示对应函数占整体的百分比。

  3. sum%:代表“累积百分比”,表示对应函数及其调用链上的函数占整体的百分比。

  4. cum:代表“累积”,表示对应函数及其调用链上的函数的执行时间或者内存占用量。

  5. cum%:代表“累积百分比”,表示对应函数及其调用链上的函数占整体的百分比。

使用实例

排查 CPU 占用情况

使用命令:

go tool pprof http://172.16.12.238:8085/debug/pprof/profile

这里可能会多等一会儿

img

排除内存使用情况

go tool pprof http://http://172.16.12.238:8085/debug/pprof/heap

输入 top 命令,查看 内存占用较高的调用:

img

可以看到内存的使用情况。

我们可以给top命令加参数,例如:top20,接着我们可以使用list命令来定位具体内存消耗在哪里,入下图:

img

这里因为我没有权限,所以无法看到具体细节。

排查频繁内存回收

我们可以使用命令查看程序的GC情况:

GODEBUG=gctrace=1 ./coupert-go | grep gc

可以看到具体的GC情况。

使用命令:

go tool pprof http://172.16.12.238:8085/debug/pprof/allocs

可以看到:

img

我们可以看到这里的rawToken占用最大,我们可以可以使用```list rawToken进行定位,这里就不做演示了。

排查协程泄露

使用命令:

go tool pprof http://172.16.12.238:8085/debug/pprof/goroutine

img

具体定位我们直接使用list命令即可。

排查锁的争用

直接使用命令:

go tool pprof http://172.16.12.238:8085/debug/pprof/mutex

img

可以看到此时是没有锁的争用。

排查阻塞操作

直接使用命令:

go tool pprof http://172.16.12.238:8085/debug/pprof/block

img

可以看到此时也没有阻塞操作的。

总结

pprof是一个性能分析工具,用于帮助开发者识别和解决应用程序的性能瓶颈。它提供了多种性能分析工具,可用于分析 CPU 使用率、内存分配、阻塞等问题。

  • 性能分析工具: pprof是Go语言标准库的一部分,可用于分析应用程序的性能问题。它提供了多种工具,包括CPU分析、内存分析、阻塞分析等。

  • CPU分析: 使用net/http/pprof包中的import _ "net/http/pprof"语句,可以启用CPU分析器。然后,通过访问/debug/pprof/profile端点,可以获取CPU分析报告。

  • 内存分析: 内存分析器可用于查找内存泄漏和高内存使用的问题。通过访问/debug/pprof/heap端点,可以获取内存分析报告。

  • 阻塞分析: 阻塞分析器帮助您了解应用程序中的阻塞情况。通过访问/debug/pprof/block端点,可以获取阻塞分析报告。

  • 可视化工具: pprof生成的分析报告可以使用图形工具进行可视化分析。可以使用go tool pprof命令来查看和分析报告,或者使用第三方工具。

  • 分析报告解释: 分析报告提供了关于函数调用图、CPU占用、内存分配等信息。开发者可以通过这些信息找出性能问题的根本原因。

  • 性能优化: 使用pprof分析工具,可以帮助开发者识别应用程序中的性能问题,然后采取措施来改进代码,提高性能。

  • 集成到应用程序中: pprof工具集成到Go的标准库中,方便开发者在应用程序中启用性能分析,以快速诊断和解决性能问题。

本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
118
粉丝
89
喜欢
173
收藏
246
排名:365
访问:2.6 万
私信
所有博文
社区赞助商