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 列表


posted @ 2023-11-13 15:28  朝阳1  阅读(42)  评论(0编辑  收藏  举报