当前位置: 首页 > article >正文

【工具】使用 Gin 集成 pprof 进行性能调优

使用 Gin 集成 pprof 进行性能调优

一、pprof 简介

pprof 表示性能分析器(Performance Profiler),其概念和初始实现来源于Google内部的性能分析需求。pprof 在程序运行期间,定期对应用的状态数据进行采样,每次采样都会记录当前的Goroutine和函数调用栈。
Go 标准库自带了 pprof 包,集成在 net/http/pprof 中,只需几行代码即可启用。

package main

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

func main() {
    go func() {
        // 在应用运行时启动 pprof 监听
        http.ListenAndServe("localhost:8080", nil)
    }()

    // 模拟业务逻辑
    select {}
}

启动程序后,访问http://localhost:6060/debug/pprof/

二、gin集成的pprof

gin作为一个轻量级、高性能的Web框架,也提供了 pprof 的集成。

  • 安装依赖
go get -u github.com/gin-contrib/pprof
  • 集成代码
package main

import (
    "github.com/gin-contrib/pprof"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    // 启用 pprof 路由
    pprof.Register(r)

    // 模拟业务路由
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    r.Run(":8080") // 启动服务
}

可以通过以下命令行获取程序运行30s的pprof记录

go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30 

在运行完成后,输入web可以看到可视化的结果,颜色越深的部分运行时间越长。
在这里插入图片描述
在这里插入图片描述
讲pprof运行结果中的文件路径复制到下个命令行中,可以在 localhost:9888 打开可视化界面。

go tool pprof -http=localhost:9888  你的路径\pprof\pprof.___11go_build_main_go.exe.samples.cpu.005.pb.gz

View 选项可以选择性能分析的查看模式:
在这里插入图片描述

  • Top: 按采样数据的总消耗量列出最耗时或最占资源的函数。用于快速定位占用最多 CPU 或内存的热点函数。
  • Graph: 生成函数调用的有向图,显示函数间的调用关系及耗时比例。可以用于分析调用链,定位调用关系复杂的性能瓶颈。
  • Flame Graph: 以火焰图的形式可视化程序的调用栈和性能分布,每个矩形表示一个函数,函数越宽,表示其耗时越多,调用链从下到上,越高的层级表示更深的调用。可以直观了解调用栈的分布和最耗时的函数链路。
  • Flame Graph(old): 早期版本的火焰图,与标准 Flame Graph 类似,但界面和交互稍显简陋,适用于兼容性需求。
  • Peek: 查看某个具体函数的详细调用信息,包括调用该函数的父函数、该函数调用的子函数和耗时占比,可用于深入分析单个函数的性能。
  • Source: 显示函数的源代码,并在对应代码行旁标注耗时和调用次数。可以直接定位源代码中的性能热点,结合代码优化更直观。
  • Disassemble : 查看函数的汇编代码,并标注每条指令的性能数据(例如耗时)。在极端优化场景下,用于深入分析代码的底层执行效率。

参考文章

每个程序员都应该掌握的Golang性能优化秘技 (这篇文章优化部分讲的很详细)


http://www.kler.cn/a/440901.html

相关文章:

  • WebRTC服务质量(05)- 重传机制(02) NACK判断丢包
  • 基于MATLAB 的数字图像处理技术总结
  • 贪心算法(二)
  • 设计模式学习[12]---观察者模式
  • Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label
  • 当服务器数据包丢失该怎样进行解决?
  • pikachu-xss通关和beef联动
  • 等值 JOIN 的分类(JOIN 简化与提速系列 2)
  • 【网络云计算】2024第50周-每日【2024/12/13】小测-理论-写10个Bash Shell脚本-解析
  • SpringBoot配置和启动
  • Linux docker-20.10.9安装
  • 如何实现序列化和反序列化?如何处理对象的生命周期管理?
  • 马克笔习惯养成法:用色彩记录你的成就
  • JS设计模式之中介者模式
  • 数字信号处理--过采样
  • 如何评估并持续优化AI呼出机器人的使用效果
  • 【大模型量化】GPTQ量化模型
  • Cookie,Seesion和Token区别及用途
  • 概率论得学习和整理29: 用EXCEL 描述二项分布
  • 餐饮喜好及健康饮食推荐小程序