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 ...
随机推荐
- kubernetes删除ns异常状态为:Terminating
在部署kuboard控制平台的时候,不规范删除,导致ns状态为Terminating [root@master01 ~]# kubectl delete namespace kuboard ^C ro ...
- 深入理解c语言指针与内存
一.将int强制转换为int指针,将int指针强转换为int void f(void) { int *p = (int*)100; //将int强制转换为int指针 printf("%d\n ...
- 18 Python如何操作文件?
本篇是 Python 系列教程第 18 篇,更多内容敬请访问我的 Python 合集 1 打开文件 通常使用内置的 open(文件路径, 模式, encoding="utf-8") ...
- sql日期创建
TRUNCATE TABLE SYS_DATEINFO declare @i int set @i=-30000 WHILE @i<1000000 BEGIN INSERT INTO SYS_D ...
- OIDC – OpenIddict Core
3 选 1 IdentityServer 4 本来 IdentityServer 4 一直都是首选的, 但在 2020 年他们决定成立公司, IdentityServer 5 就开始收费了. The ...
- Python — 循环语句
while循环语句 语法: 嵌套使用: for循环语句:(for循环外部不允许访问临时变量) 语法: 使用: 待处理的数据集: range语句: 嵌套for循环: continue: break: 随 ...
- CPU缓存伪共享
CPU缓存什么东西?当然这个问题很多人有可能觉得比较傻,CPU缓存什么,肯定是缓存数据(代码)啊,要不然还能缓存啥,这个确实没问题,但是CPU到底缓存什么样的数据呢?因为对CPU来说,无论是指令,还是 ...
- 图像形态学操作(cv2库实现)
#coding:utf-8 import SimpleITK as sitk import numpy as np import cv2 # 膨胀 def dilateion(image): kern ...
- dotnet 委托delegate的使用 定义和使用
void Main() { // 委托 - 初级和高级的分水岭 // 1. 委托的初体验 // 委托是一个引用类型,其实是一个类型,保存方法的指针(地址) (变量名字都是地址 都是指针) // 是一个 ...
- 如何解决使用 router.push 跳转路由第二次之后页面就不会刷新了
router.push({ name:"monitor", query:{ deviceid:"1676156672197922816", // 设备 ID i ...