Go 语言工具链中的 go pprof 可以帮助开发者快速分析及定位各种性能问题,如 CPU消耗 、内存分配及阻塞分析 。具体作用如下:

性能分析首先需要使用 runtime.pprof 包嵌入到待分析程序的入口和结束处 。runtime.pprof 包在运行时对程序进行每秒 100 次的采样,最少采样 1 秒。然后将生成的数据输出 , 让开发者写入文件或者其他媒介上进行分析。

go pprof 工具链配合 Graphviz 图形化工具可以将 runtime.pprof 包生成的数据转换为 PDF格式,以图片的方式展示程序的性能分析结果 。

1. 安装 Graphviz

Graphviz 是一套通过文本描述的方法生成图形的工具包。描述文本的语言叫做 DOT 。在 www.graphviz.org 网站可以获取到最新的 Graphviz 各平台的安装包 。

CentOS下,可以使用 yum 指令直接安装 :

yum install graphviz

Ubuntu

sudo apt-get install graphviz

其它平台安装方式可参考: https://www.graphviz.org/download/

2. 安装第三方包

runtime.pprof 提供基础的运行时分析的驱动,但是这套接口使用起来还不是太方便,例如:

  • 输出数据使用 io.Writer 接口,虽然扩展性很强, 但是对于实际使用不够方便,不支持写入文件;
  • 默认配置项较为复杂;

很多第三方的包在系统包 runtime.pprof 的技术上进行便利性封装,让整个测试过程更为方便。这里使用 github.com/pkg/profile 包进行例子展示,使用下面代码安装这个包:

go get github.com/pkg/profile

3. 性能分析示例

cpu.go 代码内容:

package mainimport ("time""github.com/pkg/profile"
)func joinSlice() []string {var arr []string// 为了进行性能分析,这里在己知元素大小的情况下,还是使用 append()// 函数不断地添加切片。性能较低,在实际中应该避免,这里为了性能分析,故意这样写。for i := 0; i < 1000000; i++ {arr = append(arr, "arr")}return arr
}func main() {// 开始性能分析, Start 参数都是可选项,指定的分析项目是profile.CPUProfile// profile.ProfilePath(".") 指定输出的分析文件路径,// profile.Start 返回一个停止接口stopper := profile.Start(profile.CPUProfile, profile.ProfilePath("."))// 在main结束时停止性能分析defer stopper.Stop()// 分析的核心逻辑joinSlice()// 为了保证性能分析数据的合理性,分析的最短时间是 1 秒,使用 time.Sleep()//    在程序结束前等待 1 秒。如果你的程序默认可以运行 1 秒以上,这个等待可以去掉 。time.Sleep(time.Second)
}

性能分析需要可执行配合才能生成分析结果,因此使用命令行对程序进行编译,步骤如下:

go build  -o cpu cpu.go
./cpu                                               # 运行可执行文件,在当前目录下生成 cpu.pprof
go tool pprof  --pdf cpu cpu.pprof > cpu.pdf

使用 go tool 工具链输入 cpu.pprofcpu 可执行文件,生成 PDF 格式的输出文件,将输出文件重定向为 cpu.pdf 文件。这个过程中会调用 Graphviz 工具。

4. PDF 结果

每一个框为一个函数调用的路径,第 3 个方框中 joinSlice 函数耗费了 76% 的 CPU 时间,存在性能瓶颈。

重新优化代码, 在己知切片元素数量的情况下直接分配内存,代码如下:

func joinSlice() []string {const count = 1000000var arr = make([]string, count)for i := 0; i < count; i++ {arr[i] = "arr"}return arr
}

5. 实战案例

https://github.com/wolfogre/go-pprof-practice
https://blog.wolfogre.com/posts/go-ppof-practice/

Go 学习笔记(81)— 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性能分析工具pprof

    pprof的用途 CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗CPU 周期时花费时间的位置 Memory Pro ...

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

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

  5. python爬虫自学笔记分析解密_python爬虫学习笔记——1 各种文本分析工具简介之汇总...

    此处只简单汇总一下各种文本工具名目,他们的详细使用参见具体帖子.本文主要参考<8种目前Python使用率最高的文本处理工具>一文0.SnowNLP包 用于中文文本的处理 1.Jieba 2 ...

  6. (转)超全整理!Linux性能分析工具汇总合集

    原文地址:https://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇 ...

  7. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路

    版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...

  8. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-GUI方式-Visual VM-JProfiler-Arthas

    00-谈GUI工具前的补充 补充1:内存泄漏 内存泄漏的理解与分类 何为内存泄漏( memory leak) 可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用.那么对于这 ...

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

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

最新文章

  1. 洛谷P3960 列队(Splay)
  2. 基于nginx实现minio分布式集群访问的负载均衡配置示例
  3. Bootstrap4+MySQL前后端综合实训-Day07-AM【ajax局部刷新——(单个/批量)删除用户按钮的实现、更新用户信息按钮的实现】
  4. 调查一下 大家用vs时做网页时,都用的什么标准?
  5. 制作镜像包时遇到的模块加载错误的问题
  6. Mininet与真实网络链接的方法
  7. 【老孙随笔】 神秘的茶馆
  8. druid emitter 监控模块
  9. mat1 and mat2 shapes cannot be multiplied ( )的解决
  10. 2018年专业技术人员权益保护-测试题答案
  11. uefi +gpt 系统安装 和 传统legacy + mbr 的区别
  12. 微信小程序 # 轮播图swiper滑动到最后一页进行页面跳转
  13. read_csv()报错: 'utf-8' codec can't decode byte 0xca in position 0: invalid continuation byte最新解决办法
  14. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
  15. 使用ROT13加密解密
  16. chrome开源工程(转)
  17. VS Code || Visual Studio Code 修改、添加背景图片的方式
  18. 数据库系列(5):SQL查询
  19. 今日感悟1111111
  20. 如何写新闻稿?写好新闻稿的技巧与步骤

热门文章

  1. Docker安装Apache与运行简单的web服务——httpd helloworld
  2. Solr 使用Facet分组过程中与分词的矛盾解决办法
  3. RPC 笔记(07)— socket 通信(多进程服务器)
  4. 我爱自然语言处理bert ner chinese
  5. 支持向量机SVM序列最小优化算法SMO
  6. 旷视MegEngine数据加载与处理
  7. 数字汽车钥匙的安全性增强技术
  8. 深度学习目标检测详细解析以及Mask R-CNN示例
  9. Python 创建类的成员并访问
  10. Python 判断当前数值的类型(比如x=10 获取x的类型)