golang之性能分析工具pprof
PProf 是一个 Go 程序性能分析工具,可以分析 CPU、内存等性能。Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/pprof 包即可获取程序的 profile 文件,并通过该文件来进行性能分析。
第一种: 共用一套web服务
在 gin 中使用 pprof 功能,需要用到 github.com/gin-contrib/pprof middleware,使用时只需要调用 pprof.Register() 函数即可
go get github.com/gin-contrib/pprof
使用:
package router import (
"github.com/gin-contrib/pprof"
....
) // Load loads the middlewares, routes, handlers.
func Load(g *gin.Engine, mw ...gin.HandlerFunc) *gin.Engine {
// pprof router
pprof.Register(g)
....
}
更多使用方式: github.com/gin-contrib/pprof
第二种:新开一个接口
a)引入pprof包
_ "net/http/pprof"
b)监听新端口
go func() {
log.Println(http.ListenAndServe(":6060", nil))
}()
分析命令:
go tool pprof http://127.0.0.1:8080/debug/pprof/pro
- allocs:查看过去所有内存分配的样本,访问路径为 $HOST/debug/pprof/allocs
- block:查看导致阻塞同步的堆栈跟踪,访问路径为 $HOST/debug/pprof/block
- cmdline: 当前程序的命令行的完整调用路径。
- goroutine:查看当前所有运行的 goroutines 堆栈跟踪,访问路径为 $HOST/debug/pprof/goroutine
- heap:查看活动对象的内存分配情况, 访问路径为 $HOST/debug/pprof/heap
- mutex:查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为 $HOST/debug/pprof/mutex
- profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件,访问路径为 $HOST/debug/pprof/profile
- threadcreate:查看创建新 OS 线程的堆栈跟踪,访问路径为 $HOST/debug/pprof/threadcreate
获取profile采集信息
go tool pprof http://127.0.0.1:8080/debug/pprof/profile
也可以通过浏览器访问该地址来获取当前服务状态, 包含CPU和内存情况
性能分析:
基于以上获取到的程序的profile信息,并且进入到的pprof交互界面,就可以在界面上执行topN获取采集信息

通过topN的输出可以分析出那些函数占用的CPU时间片最多,那些函数可能存在性能问题.
通过上面的输出结果,可以很清晰地看到消耗最多 CPU 资源的 10 个调用方法。
这里需要注意的是第三列的 sum% 的字段,表示的是前 N 行的 flat% 列的数值总和
参数说明:
- flat: 表示函数自身的 CPU 使用时间,单位为纳秒
- flat%:表示函数自身的 CPU 使用时间占总时间的百分比
- sum%: 表示函数及其内部调用的其他函数的 CPU 使用时间占总时间的百分比
- cum: 表示函数及其内部调用的其他函数的 CPU 使用时间之和,单位为纳秒
- cum%: 表示函数及其内部调用的其他函数的 CPU 使用时间之和占总时间的百分比
flat 和 cum 的区别在于: flat 只统计函数自身的 CPU 使用时间,不包括调用其他函数的时间,而 cum 则包括了函数自身的时间和调用其他函数的时间。
还可以使用svg来生成svg文件
前提需要下载并安装Graphviz: https://graphviz.org/
重新分析文件:
go tool pprof .\pprof.___3boss_api.exe.samples.cpu.001.pb.gz
在交互界面键入: svg 则会生成svg文件,点击打开即可

在交互式页面中,还有更多命令的支持, help查看
# 查看CPU消耗的前几位
topN # 生成svg文件
svg # 在浏览器中打开
web
常见问题:
1.在gin框架中使用pprof分析报,执行采样命令后报:profile duration exceeds server's WriteTimeout
解决: 这是执行go tool pprof http://x.x.x.x:8000/debug/pprof/profile之后,会等待30s中,进行采样操作, 如果超过了框架设置的WriteTimeout时间的话,就会报这个错误, 可以调整该属性
更多使用:
golang之性能分析工具pprof的更多相关文章
- golang 性能调优分析工具 pprof(下)
golang 性能调优分析工具 pprof(上)篇, 这是下篇. 四.net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 d ...
- 排查golang的性能问题 go pprof 实践
小结: 1.内存消耗分析 list peek 定位到函数 https://mp.weixin.qq.com/s/_LovnIqJYAuDpTm2QmUgrA 使用pprof和go-torch排查 ...
- 即时性能分析工具 Pyroscope
当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100% 时,有时候也很难复制及找出关键问题点. 本篇文章,我们会介绍一套工具叫 ...
- Java 性能分析工具 , 第 3 部分: Java Mission Control
引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...
- Java 性能分析工具 , 第 2 部分:Java 内置监控工具
引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...
- Java 性能分析工具 , 第 1 部分: 操作系统工具
引言 性能分析的前提是将应用程序内部的运行状况以及应用运行环境的状况以一种可视化的方式更加直接的展现出来,如何来达到这种可视化的展示呢?我们需要配合使用操作系统中集成的程序监控工具和 Java 中内置 ...
- 系统级性能分析工具perf的介绍与使用
测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...
- 性能分析工具-PerfView
Roslyn的PM(程序经理) Bill Chiles,Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现,这有什么秘诀呢?他最近写了一篇文章叫做<Essential Per ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- Linux性能分析工具的安装和使用
转自:http://blog.chinaunix.net/uid-26488891-id-3118279.html Normal 0 7.8 磅 0 2 false false false EN-US ...
随机推荐
- manim边学边做--角度标记
manim中绘制一个角度其实就是绘制两条直线,本篇介绍的不是绘制角度,而是绘制角度标记. 对于锐角和钝角,角度标记是一个弧,弧的度数与角的度数一样: 对于直角,角度标记是一个垂直的拐角. manim中 ...
- 『面试题』WEB前端面试专题-Promise相关
题目一 const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); ...
- 【论文解读】RLAIF基于人工智能反馈的强化学习
[论文解读]RLAIF基于人工智能反馈的强化学习 一.简要介绍 人类反馈强化学习(RLHF)可以有效地将大型语言模型(LLM)与人类偏好对齐,但收集高质量的人类偏好标签是一个关键瓶颈.论文进行了一场R ...
- RxJS 系列 – 目录
请按顺序阅读 概念篇 Observable & Creation Operators Subject Observable to Subject (Hot, Cold, Warm, conne ...
- CSS – Font / Text 属性
前言 之前学 W3Schools 时记入过一些 W3Schools 学习笔记 (1) – CSS Fonts. 由于太简单就没有另外写一篇, 现在感觉内容比较整齐了, 所以整理一篇出来. 属性 fon ...
- RabbitMQ——死信队列介绍和应用
死信和死信队列的概念 什么是死信?简单来说就是无法被消费和处理的消息.一般生产者将消息投递到broker或者queue,消费者直接从中取出消息进行消费.但有时因为某些原因导致消息不能被消费,导致消息积 ...
- MyBatis——案例——添加
添加 1.编写接口方法:Mapper接口 参数:除了 id 之外的所有数据 结果:void /** * 添加 */ void add(Brand brand); 2.编写SQL ...
- RDK X5首发上手体验!真的太帅啦!!!
RDK X5首发上手体验!真的太帅啦!!! 本Blog同步发表于: 地瓜机器人开发者论坛: CSDN: 一年多以前无意中了解到了RDK X3,之后我便迅速的被地平线机器人开发者论坛(现在改名为了地瓜机 ...
- Go语言对接微信支付与退款全流程指南
目录: 一.准备工作 二.初始化微信支付客户端 三.实现支付功能 1. 付款时序图 2. 实现不同场景下的支付 WAP端支付 PC端支付 Android端支付 3. 解析支付回调 四.实现退款功能 退 ...
- 关于自动部署 - 基于gitlab关联 腾讯云 web 应用
gitlab 相当于 gitee 的企业版形式 : 步骤 1. 使用 Vscode 编写代码,使用 gitlab托管代码, 2. 新建腾讯云 web 应用 ,gitlab 关联 web应用, 3. 每 ...