Golang大杀器之pprof
需要下载graphviz
package main
import (
"math/rand"
"os"
"runtime/pprof"
"time"
)
func generate(n int) []int {
rand.Seed(time.Now().UnixNano())
nums := make([]int, 0)
for i := 0; i < n; i++ {
nums = append(nums, rand.Int())
}
return nums
}
// bubbleSort 冒泡排序。
func bubbleSort(nums []int) {
for i := 0; i < len(nums); i++ {
for j := 1; j < len(nums)-i; j++ {
if nums[j] < nums[j-1] {
nums[j], nums[j-1] = nums[j-1], nums[j]
}
}
}
}
func main() {
f, _ := os.OpenFile("cpu.pprof", os.O_CREATE|os.O_RDWR, 0644)
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
n := 10
for i := 0; i < 5; i++ {
nums := generate(n)
bubbleSort(nums)
n *= 10
}
}
go run main.go
go tool pprof -http=:9999 cpu.pprof
基于gin框架封装好的包 https://github.com/gin-contrib/pprof
或者结合gin框架,线上起一个协程,时时监控
package main
import (
"github.com/gin-gonic/gin"
"net/http"
_ "net/http/pprof" // 导入 pprof 包
)
func main() {
// 创建一个 Gin 路由器
router := gin.Default()
// 注册 Gin 的路由
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello World")
})
// 设置 pprof 的路由,通常放在 /pprof 下
go func() {
// 启动一个 HTTP 服务来处理 pprof 请求
// 注意:在生产环境中,你可能需要使用更安全的机制来暴露这些端点
http.ListenAndServe(":6060", nil)
}()
// 启动 Gin 服务器
router.Run()
}
http://localhost:6060/debug/pprof/ - 显示所有可用的 pprof 端点
http://localhost:6060/debug/pprof/profile - 获取 CPU 分析数据
http://localhost:6060/debug/pprof/heap - 获取内存分析数据
http://localhost:6060/debug/pprof/goroutine - 获取 goroutine 列表