最近使用go内置的http client 调用第三方的接口时,在Prometheus监控中发现goroutine数据非常高。在排查这个问题时,发现一个非常好用的工具。不过使用本文排查问题时,前提条件项目使用的是gin框架开发的web项目。
通过下面操作,可以就顺利集成和使用 pprof 来收集和分析 Gin 应用的性能数据。可以查看 CPU 使用情况、内存占用、以及其他运行时性能数据,并通过图形化界面进行深度分析。
首先,确保安装了github.com/gin-contrib/pprof
包,以便在 Gin 应用中启用 pprof 路由。
go get github.com/gin-contrib/pprof
在Gin 应用项目中,注册 pprof 路由,确保程序可以提供性能分析数据。
package main
import (
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
// 创建 Gin 路由
r := gin.Default()
// 注册 pprof 路由
pprof.Register(r)
// 定义其他路由
r.GET("/hello", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "hello world",
})
})
// 启动 Gin 服务
r.Run(":8080")
}
在程序运行时,访问以下 URL 来收集不同类型的性能数据:
收集 30 秒的 CPU 使用情况
http://localhost:8080/debug/pprof/profile?seconds=30
http://localhost:8080/debug/pprof/heap
http://localhost:8080/debug/pprof/goroutine
http://localhost:8080/debug/pprof/block
http://localhost:8080/debug/pprof/threadcreate
package main
import (
"log"
"os"
"runtime/pprof"
"time"
)
func main() {
// 创建并打开 cpu.pprof 文件
f, err := os.Create("cpu.pprof")
if err != nil {
log.Fatal(err)
}
defer f.Close()
// 开始 CPU 性能分析
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
// 模拟一些负载,以便有足够的计算样本
time.Sleep(5 * time.Second) // 让程序运行 5 秒,收集数据
}
这个代码段将会在程序执行时生成 cpu.pprof 文件。你可以调整 time.Sleep() 时间来让程序有足够的时间收集样本。
使用 go tool pprof
分析 pprof 文件
下载并安装 Graphviz,它用于生成可视化图表
https://graphviz.org/download/
这将启动一个 Web 服务器,可以通过访问http://localhost/ui/
来查看 CPU 性能分析的图形界面。
正确的操作顺序
localhost:8080
)。go tool pprof
或通过浏览器访问 http://localhost:8080/debug/pprof/
来收集性能数据。go tool pprof
中分析生成的.pprof
文件,或者通过 Web 界面查看性能数据。如果使用了go tool pprof -http=:80
命令启动 Web 界面,可以通过浏览器访问以下地址来查看分析结果:
http://localhost/ui/
CPU性能图:http://localhost/ui/
。
生成的图表:可以通过Web UI
或者go tool pprof
的 web 命令来生成 png、svg 等格式的图表。
通过这种方式,可以查看函数调用关系、函数的CPU占用情况、内存使用等信息,从而更有针对性地进行性能优化。