pprof的用途

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置。阻塞分析对分析程序并发瓶颈非常有帮助。
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

所以当内存或者cpu飙升的时候,我们可以使用go自带的性能分析利器pprof来查找问题所在。

Go 语言自带的 pprof 库就可以分析程序的运行情况,并且提供可视化的功能。它包含两个相关的库:
runtime/pprof
对于只跑一次的程序,例如每天只跑一次的离线预处理程序,调用 pprof 包提供的函数,手动开启性能数据采集。
net/http/pprof
对于在线服务,对于一个 HTTP Server,访问 pprof 提供的 HTTP 接口,获得性能数据。当然,实际上这里底层也是调用的 runtime/pprof 提供的函数,封装成接口对外提供网络访问。

利用runtime/pprof包实现cpu分析的步骤

package mainimport ("flag""fmt""log""os""runtime/pprof"
)//执行 go run main -help 查看帮助信息
//执行 go run main -cpuprofile cpu.prof 生成cpu性能分析文件
func main() {var cpuprofile = flag.String("cpuprofile", "", "请输入 -cpuprofile 指定cpu性能分析文件名称")//在所有flag都注册之后,调用:flag.Parse()flag.Parse()f, err := os.Create(*cpuprofile)if err != nil {log.Fatal("could not create CPU profile: ", err)}// StartCPUProfile为当前进程开启CPU profile。if err := pprof.StartCPUProfile(f); err != nil {log.Fatal("could not start CPU profile: ", err)}// StopCPUProfile会停止当前的CPU profile(如果有)defer pprof.StopCPUProfile()sum := 0for i := 0; i < 100; i++ {sum += i}fmt.Printf("sum=%d\n", sum)
}

这里对flag.String参数的解释如下:


2、执行命令生成本地文件cpu.prof:
go run main.go -cpuprofile cpu.prof

3、对文件进行分析:
go tool pprof cpu.prof

对应的参数说明:

利用runtime/pprof包实现内存分析的步骤:

package mainimport ("flag""fmt""log""os""runtime""runtime/pprof"
)//执行 go run main -help 查看帮助信息
//执行 go run main -menprofile men.prof 生成内存性能分析文件
func main() {var menprofile = flag.String("menprofile", "", "请输入 -menprofile 指定内存性能分析文件名称")//在所有flag都注册之后,调用:flag.Parse()flag.Parse()f, err := os.Create(*menprofile)if err != nil {log.Fatal("could not create memory profile: ", err)}defer f.Close() // error handling omitted for exampleruntime.GC()    // get up-to-date statisticsif err := pprof.WriteHeapProfile(f); err != nil {log.Fatal("could not write memory profile: ", err)}sum := 0for i := 0; i < 100; i++ {sum += i}fmt.Printf("sum=%d\n", sum)
}

然后就是生成本地性能分析文件和查看文件:

总结:
其实,我们可以把上面两个代码合并,输入 go run main.go -cpuprofile cpu.prof -menprofile men.prof同时生成cpu和内存的性能分析文件。

利用net/http/pprof包进行性能分析

这个很简单,直接启动一个端口(和正常提供业务服务的端口不同)监听 pprof 请求:

package mainimport ("fmt""gin_pro/pkg/setting""gin_pro/routers""net/http"_ "net/http/pprof"
)func main() {//用于pprof检测内存使用情况go func() {http.ListenAndServe("0.0.0.0:8080", nil)}()router := routers.InitRouter()s := &http.Server{Addr:           fmt.Sprintf(":%d", setting.HTTPPort),Handler:        router,ReadTimeout:    setting.ReadTimeout,WriteTimeout:   setting.WriteTimeout,MaxHeaderBytes: 1 << 20, // 1* 2^20 = 1*1024*1024 = 1M}s.ListenAndServe()
}

然后在终端执行以下命令就能查看对应的数据了:

#所有过去内存分配的采样
go tool pprof http://127.0.0.1:8080/debug/pprof/allocs#对活动对象的内存分配进行采样(活动)
go tool pprof http://127.0.0.1:8080/debug/pprof/heap# 下载 cpu profile,默认从当前开始收集 30s 的 cpu 使用情况,需要等待 30s
go tool pprof http://127.0.0.1:8080/debug/pprof/profile
# wait 120s
go tool pprof http://127.0.0.1:8080/debug/pprof/profile?seconds=120    #导致同步原语阻塞的堆栈跟踪
go tool pprof http://127.0.0.1:8080/debug/pprof/block#所有当前goroutine的堆栈跟踪
go tool pprof http://127.0.0.1:8080/debug/pprof/goroutine#争用互斥锁持有者的堆栈跟踪
go tool pprof http://127.0.0.1:8080/debug/pprof/mutex#当前程序的执行轨迹。
go tool pprof http://127.0.0.1:8080/debug/pprof/trace

在可以直接在浏览器查看:
http://127.0.0.1:8080/debug/pprof/

go性能分析工具pprof相关推荐

  1. Go性能分析工具pprof详解

    文章目录 一.什么是pprof 二.怎么使用pprof 1. 工具型应用 2. 服务型应用 三.`pprof`数据分析 CPU Profiling top指令排序展示 web指令生成图示 list指令 ...

  2. golang性能分析工具pprof介绍

    1 golang性能分析工具pprof介绍 文章目录 1 golang性能分析工具pprof介绍 1.1 pprof简介 1.2 pprof引入方法 1.3 使用pprof进行分析的方法 1.3.1 ...

  3. Go 学习笔记(81)— Go 性能分析工具 pprof

    Go 语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU消耗 .内存分配及阻塞分析 .具体作用如下: 性能分析首先需要使用 runtime.pprof 包嵌入到待分 ...

  4. gbd 分析core文件_Go 性能分析工具 pprof 入门

    (给Go开发大全加星标) 来源:wudaijun https://wudaijun.com/2018/04/go-pprof/ [导读]pprof是golang用于性能分析的工具.可以生成图形和文本报 ...

  5. go build 无文件_Go学习_30_Golang代码性能分析工具

    Golang内置了一些性能分析工具,可以将性能分析的结果文件输出,我们可以使用图形化的工具查看分析结果,在使用这些工具之前,我们需要安装一些工具,以便于查看分析文件. 为了支持查看图形化分析结果,首先 ...

  6. C++ 性能分析工具调研

    文章目录 0. 前言 1. gprof 3. valgrind 4. gperftools 5. perf 0. 前言 目标:性能分析(profile)包含的内容特别多,但目前我只关注运行时间. 详细 ...

  7. 正确使用 Android 性能分析工具——TraceView

    前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂T ...

  8. php性能分析工具 - xhprof的安装使用

    一.前言 有用的东西还是记录下来吧,也方便以后的查询:这次记录一下xhprof的安装使用: xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, ...

  9. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

最新文章

  1. java命名course为名的class_Java教程之变量命名
  2. Charpter 8:Declarative Middleware Using AOP:expert one-on-one J2EE Development without EJB.(读后感)...
  3. C++ 面试知识总结
  4. Taxlive2020安装~新手向
  5. GitHub 热榜:这款开源神器可帮您将文本转换为手写文字,并下载为 PDF 格式文件!...
  6. linux PHP ppt 转图片,linux下用php将doc、ppt转图片
  7. java 微信支付实现
  8. linux7做服务器,centos7 搭建yum服务器
  9. 【渝粤教育】广东开放大学 文学创意写作 形成性考核 (58)
  10. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(2)--(P3P)
  11. 服务器电脑 默认虚拟内存,服务器是否需要设置虚拟内存
  12. mybatis log4j 在日志中打印sql_SpringBoot整合MyBatis+详细打印执行SQL语句
  13. JavaScript面试大全(二)
  14. 腾讯推出基于区块链存证的“点亮莫高窟”活动
  15. 正则表达式确实是一种考验
  16. linux rtl8111/8168网卡驱动下载,Debian Linux 编译 Realtek (RTL8111/RTL8168) 网卡驱动
  17. 【iOS】—— 调用手机相机和相册
  18. ecshop ecmall shopex
  19. idea中java文件都不能运行变成橙色文件
  20. vivo图像算法工程师双非研究生可以吗_双非材料专业小硕秋招春招找工作历程,希望对大家有帮助,劝退警告!!!...

热门文章

  1. 原根与NTT 五千字详解
  2. 华为云等保安全服务,企业网络安全建设的福音
  3. my sql实验视图_关于MY SQL的视图,希望大家帮忙
  4. java与javaScript 语法的区别
  5. FPGA之旅设计99例之第二例-----按键
  6. ClownFish 使用说明
  7. (附源码)计算机毕业设计ssm宠物短期寄养平台
  8. 斐波那契数列(递归+源码+注释)
  9. 连接ORACLE 数据库 ORA-12505 SID 错误
  10. 通过JQuery ajax获取服务器时间