利用pprof对golang进行性能分析

利用pprof进行性能分析

pprof性能分析的5个方面

一、性能分析的五个核心维度

  • CPU分析 - 剖析程序的CPU使用情况,定位高耗时函数

  • 内存分析 - 追踪内存分配与泄露,优化内存使用模式

  • IO分析 - 监控文件/网络IO操作,发现瓶颈资源

  • Goroutine分析 - 检测协程泄露与异常堆栈

  • 并发问题分析 - 诊断死锁及通过race detector检测数据竞争

数据采集时间

生产环境采集:选择业务低峰期进行采样(凌晨2-4点)

测试环境采集:模拟真实负载场景进行压力测试

黄金准则:采样时长控制在30-60秒,确保覆盖完整业务周期

pprof集成方案

1、方案1:HTTP服务集成(推荐)

import ("net/http",_ "net/http/pprof"
)func main(){go func(){if err:=http.ListenAndServer(addr:"6060",handler:nil);err!=nil{log.Fatal(err)}os.Exit(code:0)}()
}

可以加入runtime,开启对锁调用的跟踪。

import ("runtime"
)func main(){runtime.SetMutexProfileFraction(rate:1) //开启对锁的跟踪runtime.SetBlockProfileRate(rate:1)  //开启对阻塞的跟踪go func(){if err:=http.ListenAndServer(addr:"6060",handler:nil);err!=nil{log.Fatal(err)}os.Exit(code:0)}()
}

有聪明的小伙伴可能会问“持续性采样,会不会影响服务器性能啊”。其实不会,pprof服务会按需采样,大部分端点只在请求时生成数据持续监控。只有runtime统计信息(如goroutine数量)会实时更新,因此只要控制好你的请求频率,不会对生成开发过程造成很大影响。

2、通过基准测试采集数据

func BenchmarkMyFunc(b *testing.B) {// 测试逻辑...
}

执行命令采集数据go test -bench=. -cpuprofile=cpu.out

诊断端点详解

针对第一种HTTP服务集成,访问 http://localhost:6060/debug/pprof/ 获取以下分析入口:

分析类型描述启用方式
allocs跟踪所有内存分配情况(包括已释放的内存)默认启用
block分析阻塞操作(如 channel 阻塞、锁等待)需调用 SetBlockProfileRate
cmdline显示程序启动时的命令行参数默认启用
goroutine统计当前所有 goroutine 的堆栈跟踪信息默认启用
heap分析当前活跃的堆内存分配(与 allocs 不同,仅包含未释放的内存)默认启用
mutex跟踪锁竞争情况(如 sync.Mutex 的争用)需调用 SetMutexProfileFraction
profile采集 CPU 使用数据,支持 seconds 参数(默认 30 秒)默认启用
threadcreate跟踪操作系统线程创建情况(常用于检测 goroutine 泄漏)默认启用

我们发现,在http://localhost:6060/debug/pprof/中的文件可读性非常差,实际上它只是作为一个数据源。我们可以通过性能分析工具对其文件进行分析。golang中有自带的go tool pprof工具。

可以直接将文件下载下来对文件进行分析,也可以直接使用文件的url。

如果要导出图片或者pdf等文件,需要下载 graphviz。大家想的话,可以自己搜索下载。

可视化分析

可以使用 go tool pprof +source (source可以是可执行文件,也可以是网址。)

例如 go tool pprof http://localhost:6060/debug/pprof/allocs
可以在命令行中分析程序内存使用情况。

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
可以分析CPU使用情况。(采集30秒)

运行过上述命令后,即进入命令行终端。可以通过help查看支持的指令。

我们介绍几个常用的:top,list,web

top命令 显示资源消耗TOP N函数

最常用的top,查看使用的数据,默认取前10条,可以使用top 5 ,可以查看消耗资源(内存,协程数,cpu用的最多的等等)最多的5个。其中的指标有:

指标全称技术定义
flatExclusive Time函数自身直接消耗的CPU时间/内存量(不包含子调用)
flat%Exclusive Percentage当前函数独占资源占总采样资源的百分比
cumCumulative Time函数及其调用链消耗的总资源(包含所有子调用)
cum%Cumulative Percentage函数调用链资源消耗占总采样资源的百分比
sum%Aggregated Percentage当前函数及其之前函数资源消耗的累计占比(TOP列表特有指标)

list命令 源码级函数分析

通过list可以展开源代码,list + 某个interface,或者函数,会列出其所有interface对应的方法,或所有函数实现的源代码。可以结合top一起使用,查看消耗资源最多的出现在

web生成可视化图形

通过 web可以打开分析的连线图。

图中,有很多长方形,框框越大,代表消耗的资源越多。线约粗,整个调用栈消耗的资源越多。

每个方格中第一行,代表包名。
第二行,对象名。
第三行代表方法名。
第四行,flat(flat%)。
第五行,cum(cum%)。

图形化分析

通过 go tool pprof 的 Web 交互模式,可以将远程 pprof 数据本地可视化,实现命令行功能的图形化操作。具体流程如下:

go tool pprof -http=:8000 http://localhost:6060/debug/pprof/goroutine

功能模块对应命令行操作核心作用交互优势
Toptop展示资源消耗 Top N 的函数(按 CPU/内存/锁等指标排序)动态排序 + 百分比占比可视化
Graphweb生成函数调用关系拓扑图(需 Graphviz)链路依赖关系一目了然
Flame Graph无直接对应命令通过火焰图直观定位性能瓶颈(层级宽度=资源消耗量)快速识别热点代码路径
Peekpeek <function>聚焦特定函数及其上下游调用链无需记忆命令,点击交互
Sourcelist <function>源码级资源消耗分析(显示每行代码的资源开销)直接关联业务代码
Comparediff_base对比两个 Profile 文件的差异(常用于优化前后效果验证)差异高亮 + 变化量统计

关键特性说明:

  1. 本地化分析

    工具可以将远程 pprof 数据下载到本地(存储于 ~/pprof 目录)进行分析,避免对生产服务造成性能影响。

  2. ​协议兼容性

    支持 HTTP/HTTPS 协议拉取数据,适用于 Kubernetes 等容器环境。
    例如 go tool pprof -http=:8000 https://k8s-cluster:443/debug/pprof/profile

  3. ​原生指令支持

    网页顶部提供命令行输入框,可直接执行 top -cum 等高级参数指令,实现精准过滤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35555.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

实验篇| Nginx环境搭建-安全配置

在前面的文章里&#xff0c;阿祥详细介绍了在 Windows 系统中安装 Nginx 服务器的具体操作步骤&#xff0c;感兴趣的朋友可以参考&#xff1a;实验篇 | Nginx 反向代理 - 7 层代理 。完成 Nginx 的安装只是搭建 Web 服务的第一步&#xff0c;为了保障服务器的稳定运行以及数据安…

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以&#xff0c;去哪些地方可以找数据手册 一个例子&#xff1a;STM32F103C8T6 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …

Blender材质 - 层权重

层权重 混合着色器 可以让 面朝向的一面显示一种材质 另一面显示另一种材质 就能实现挺不错的材质效果 移动视角 材质会跟着变化 有点类似虚幻的视差节点BumpOffset

3个 Vue $set 的应用场景

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; 在 Vue2 中&#xff0c;由于 Object.defineProperty 的限制&#…

Flutter_学习记录_ ImagePicker拍照、录制视频、相册选择照片和视频、上传文件

插件地址&#xff1a;https://pub.dev/packages/image_picker 添加插件 添加配置 android无需配置开箱即用&#xff0c;ios还需要配置info.plist <key>NSPhotoLibraryUsageDescription</key> <string>应用需要访问相册读取文件</string> <key>N…

LeetCode 解题思路 19(Hot 100)

解题思路&#xff08;递归&#xff09;&#xff1a; 终止条件&#xff1a; 若节点为空&#xff0c;返回深度0。递归步骤&#xff1a; 分别计算左子树和右子树的最大深度&#xff0c;取较大者并加1&#xff08;当前节点&#xff09;。 Java代码&#xff1a; class Solution {…

如何启用 HTTPS 并配置免费的 SSL 证书

引言 HTTPS 已成为现代网站安全性的基础要求。通过 SSL/TLS 证书对数据进行加密&#xff0c;不仅可以保护用户隐私&#xff0c;还能提升搜索引擎排名并增强用户信任。本指南将详细介绍如何通过 Lets Encrypt&#xff08;免费、自动化的证书颁发机构&#xff09;为您的网站启用…

element-plus中Popconfirm气泡确认框组件的使用

1、基本使用 从element-plus官网复制代码&#xff1a; <template><el-popconfirm title"Are you sure to delete this?"><template #reference><el-button>Delete</el-button></template></el-popconfirm> </template…

软件需求分类、需求获取(高软46)

系列文章目录 软件需求分类&#xff0c;需求获取 文章目录 系列文章目录前言一、软件需求二、获取需求三、真题总结 前言 本节讲明软件需求分类、需求获取的相关知识。 一、软件需求 二、获取需求 三、真题 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

鸿蒙应用程序包HAP的开发与使用

1、HAP是什么&#xff1f; HAP&#xff08;Harmony Ability Package&#xff09;是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包&#xff0c;其主要分为两种类型&#xff1a;entry和feature。 entry&#xff1a;应用的主模块&#x…

【Mac】安装 Parallels Desktop、Windows、Rocky Linux

一、安装PD 理论上&#xff0c;PD只支持试用15天&#xff01;当然&#xff0c;你懂的。 第一步&#xff0c;在 Parallels Desktop for Mac 官网 下载 Install Parallels Desktop.dmg第二步&#xff0c;双击 Install Parallels Desktop.dmg 第三步&#xff0c;双击安装Paralle…

matlab 自适应模糊PID在反应釜温度控制中的应用

1、内容简介 matlab163-自适应模糊PID在反应釜温度控制中的应用 可以交流、咨询、答疑 2、内容说明 略摘要:针对工业过程控制具有时变、滞后、非线性等特点,在传统 PID 控制中融入模糊控制的功能,形成了新的参数自 适应模糊 PID 控制器,并把它应用在化工制药中常用的反应釜温度…

基于FPGA的3U机箱温度采集板PT100,应用于轨道交通/电力储能等

板卡简介&#xff1a; 本板为温度采集板&#xff08;PT100&#xff09;&#xff0c;对目标进行测温&#xff0c;然后将温度转换成处理器可识别的电流信号。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff0c;DC15V 4线制PT100&#xff1a;7路&#xff08;标称测温范围…

管家婆实用贴-如何设置打印机共享

很多商家在使用管家婆软件经营日常业务时会有多个操作员多台电脑需要打印&#xff0c;但是不想每台电脑配置一台打印机&#xff0c;一台电脑专门用来打印又浪费设备。遇到这种情况时可以将插线电脑上的打印机共享给其他的电脑一起使用&#xff0c;方便又高效。今天来和小编一起…

Qt QML实现视频帧提取

## 前言 视频帧率&#xff08;Frame Rate&#xff09;是指视频播放时每秒显示的画面帧数&#xff0c;通常用fps&#xff08;Frames Per Second&#xff09;来表示。视频是由一系列静止的图像帧组成的&#xff0c;而视频帧率则决定了这些图像帧在单位时间内播放的速度。较高的视…

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计&#xff0c;通过实用的LabVIEW图形化编程语言&#xff0c;优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性&#xff0c;以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…

3.17学习总结 java数组

地址值&#xff1a; D&#xff1a;表示当前数组内元素元素是double类型的 索引>下标&#xff0c;从0开始 最大索引&#xff1a;数组长度-1 把数据存储到数组中&#xff0c;一旦覆盖之后&#xff0c;原来的数据就不存在了 数组的遍历&#xff1a; 遍历&#xff1a;是取…