这是什么

想要进行性能优化,Go本身自带的工具链就包含了性能分析工具,而且也非常棒,pprof就是Go性能分析的利器,它是Go语言自带的包,有如下两种:

  1. runtime/pprof:采集程序(非 Server)的运行数据进行分析
  2. net/http/pprof:采集 HTTP Server 的运行时数据进行分析,这个其实在上面的功能中包了一层提供了http接口。

pprof用于可视化和性能分析的工具,pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)

这个文件是一个ProtocolBuffer v3的描述文件,它描述了一组callstack和 symbolization信息,作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式

使用方式

Report generation:报告生成,直接生成一个文件,解析这个文件得到结果

Interactive terminal use:交互式终端使用,实时反馈,监控,需要开发人员输入指令,根据输入的指令返回想要的信息。

Web interface:Web 界面,实时反馈,监控,对开发人员友好。很方便,直观的获取和统计需要的数据。

能做什么

CPU Profiling: CPU分析,按照一定的频率采集所监听的应用程序的CPU使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置。

Memory Profiling:内存分析,在应用程序堆栈分配时记录跟踪,用于监视当前和历史内存使用情况,检查内存泄漏情况。

Block Profiling:阻塞分析,记录goroutine阻塞等待同步的位置

Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

一个小Demo来解释

import (
"net/http"
_ "net/http/pprof"
)
func PprofWeb() {
err := http.ListenAndServe(":9909", nil)
if err != nil {
panic(err)
}
}
web界面使用

启动这段代码后,访问 http://localhost:9909/debug/pprof/ ,就可以看到监控页面了,截图信息如下,我们对这些进行一下解释。

allocs:所有过去内存分配的采样

block:导致同步原语阻塞的堆栈跟踪

cmdline:当前程序的命令行调用

goroutine:所有当前goroutine的堆栈跟踪

heap:活动对象的内存分配的采样。在获取堆样本之前,可以指定gc GET参数来运行gc。

metux:争用互斥锁持有者的堆栈跟踪

profile:CPU配置文件。您可以在seconds GET参数中指定持续时间。获取配置文件后,使用go tool pprof命令调查配置文件

threadcreate:导致创建新操作系统线程的堆栈跟踪

trace:当前程序的执行轨迹。您可以在seconds GET参数中指定持续时间。获取跟踪文件后,使用go tool trace命令调查跟踪

交互式终端使用

控制台输入如下命令,这个命令的作用是追踪上面代码60秒内CPU的消耗情况,执行该命令后,需要等待60秒(这个时间可自己调整),60秒到达后默认进入pprof交互式命令行中,可输入help命令查看pprof的使用帮助

go tool pprof http://localhost:9909/debug/pprof/profile?seconds=60

我们看下面图片,命令执行后,过了10秒钟进入交互式控制台,我输入了top10,代表意思是显示前10个消耗CPU较多的方法,图中的flat,sum,cum是什么含义呢,接下来解释一下。

flat:给定函数上的运行耗时

flat% :给定函数上的CPU运行耗时占比

sum% :给定函数累积使用CPU总比例

cum :当前函数加上它之前的调用运行总耗时

cum% :当前函数加上他之前的调用CPU运行耗时占比

还有其它很多的命令比如 list,使用 list 函数名 命令查看具体的函数分析,同样的,下面的命令行可以查看堆内存,阻塞,锁的使用情况

go tool pprof http://localhost:9099/debug/pprof/heap
go tool pprof http://localhost:9099/debug/pprof/block
go tool pprof http://localhost:9099/debug/pprof/mutex

可视化界面使用

在上面的web界面中我们可以看到一行profile文字,点击这个文字可以下载一个profile文件,下载完成之后。我们在这个文件所在目录运行如下命令,有两种方式

go tool pprof profile文件名, 此时会进入一个交互式控制台,输入命令 web会产生一个svg文件,程序回启动浏览器自动打开这个文件,即可进入可视化界面。我们也可以在上面CPU分析中的控制台中以同样的方式进入可视化界面。

go tool pprof -http=:8080 profile文件名 ,此时浏览器会默认打开localhost:8080访问 ,建议使用这种方式,获取更好体验。

如果出现下面错误,你需要安装一个软件Graphviz,安装地址如下,这是一个图形可视化软件,安装完成之后配置环境变量

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%

如下图,展示CPU的在各个方法上的运行时间,关于图形的说明: 每个框代表一个函数,理论上框的越大表示占用的CPU资源越多。 方框之间的线条代表函数之间的调用关系。 线条上的数字表示cpu执行时间。 方框中的第一行数字表示当前函数占用CPU的百分比,第二行数字表示当前函数累计占用CPU的百分比。

火焰图

使用火焰图需要手动安装Pprof原生工具,这是google提供的一个工具,记住google和Go官方不是一个概念。

go get -u github.com/google/pprof

启动火焰图可视化工具

pprof -http=:8080 profile文件名

访问web地址 localhost:8080,如果上面的命令不加-http=:8080,则默认进入交互式控制台,输入web命令,生成一个文件自动启动浏览器自动打开,火焰图明显比上面Go官方的可视化界面要精致许多。

如何观察下面的火焰图呢?Y轴表示调用栈,每一层都是一个函数,调用栈越深火焰就越高,最底部是正在执行的函数,上面是它的父函数,X轴表示这个函数的抽样数,如果一个函数在X轴占的越宽,代表抽样数越高,执行CPU的时间越长,注意,X轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的.

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题

uber 也开源了一个火焰图工具,github地址如下,教程很多,大家可以了解了解。

github.com/uber/go-torch,

对非web程序的性能分析

截至目前,上面我们都是对一个web应用程序进行性能检测分析,用到的都是http接口形式访问,那么一个非web程序应该监测性能呢?如果你仔细观察你会发现性能分析的本质就是对profile文件进行分析,所以我们需要在一个非web应用程序中生成一个profile文件出来,这样就可以通过go tool pprof工具分析这个文件了

在runtime/pprof 提供了很多方法用来统计程序运行过程中CPU和内存的消耗情况,下面我们一起实践一下。

下面这段代码获取CPU的profile文件,会在当前目录下生成一个cpu.prof文件,之后我们可以通过go tool prof -http=:8080 cpu.prof 这个命令用浏览器来查看cpu的使用情况

func PProfCPUApplication() {
f, _ := os.Create("./cpu.prof")
pprof.StartCPUProfile(f) for i := 1; i < 3000; i++ {
time.Sleep(3 * time.Millisecond)
RandomInt(10, 50)
}
pprof.StopCPUProfile()
f.Close()
}

下面这段代码获取内存的profile文件,会在当前目录下生成一个mem.prof文件,之后我们可以通过go tool prof -http=:8080 mem.prof 这个命令用浏览器来查看内存的使用情况

func PProfMemApplication() {
f, _ := os.Create("./mem.prof")
for i := 1; i < 3000; i++ {
time.Sleep(3 * time.Millisecond)
RandomInt(10, 50)
}
pprof.WriteHeapProfile(f)
f.Close()
}

如何用好Go的测试黑科技一文中也说到可以用go test在测试时使用指定参数生成CPU和内存的profile文件。

go test -bench . -cpuprofile= cpu.prof
go test -bench . -memprofile= mem.prof

对Pprof的简单介绍就到这里了,有关更多PProf的性能分析大家可以更深入的研究,一起交流。

Go性能分析大杀器PPROF的更多相关文章

  1. DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?

          DSP技术,在某些人看来,或者已经面临着英雄迟暮的感觉,就我们当前所知道的.Freesacle.ADI.NXP早就停掉了新技术发展,而当前从大的方面说只剩下TI一家扛着Digital Si ...

  2. 使用docker-compose 大杀器来部署服务 上

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  3. 使用docker-compose 大杀器来部署服务 上(转)

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  4. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  5. [转]使用docker-compose 大杀器来部署服务 上

    本文转自:https://www.cnblogs.com/neptunemoon/p/6512121.html 使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker ...

  6. 离群点检测与序列数据异常检测以及异常检测大杀器-iForest

    1. 异常检测简介 异常检测,它的任务是发现与大部分其他对象不同的对象,我们称为异常对象.异常检测算法已经广泛应用于电信.互联网和信用卡的诈骗检测.贷款审批.电子商务.网络入侵和天气预报等领域.这些异 ...

  7. 使用docker-compose 大杀器来部署服务

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  8. Postgresql-模糊匹配大杀器

    # Postgresql-模糊匹配大杀器 ## 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser) ...

  9. 一文读懂机器学习大杀器XGBoost原理

    http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起 ...

随机推荐

  1. crm项目-stark组件分析

    ###############    stark组件     ################ """ 这个stark组件是非常神奇的 1,独立的一个组件 2,没有mod ...

  2. COMET探索系列一【COMET实践笔记】

    这几天在给公司的一个点对点聊天系统升级,之前只是使用简单的ajax轮询方式实现,每5秒钟取一次数据,延时太长,用户体验不是很好,因此打算采用服务器推送技术,故此整理了以下文档,将自己找到的一些资料及心 ...

  3. [LC] 114. Flatten Binary Tree to Linked List

    Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...

  4. Reading

    Reading一共18min 需要背诵专业学科分类的词汇. 单词上,背四级词汇和托福词汇,达到约1w词汇. 句子上,练习速度和用词准确,其中准确包括含义准确和语序准确.  

  5. 分布式Web服务器架构(通俗易通)

    最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网 ...

  6. 【转载/部分修改】超实用STL——set的入门使用

    本文部分转载自他人博文,少部分自行进行了添改qwq 参考文章:https://blog.csdn.net/chaoyueziji123/article/details/38422211 作者:chao ...

  7. get请求直接通过浏览器发请求传数组或者list到后台

    原文链接: http://blog.csdn.net/qq_27093465/article/details/76160419 感谢原作者 例如: http://localhost:27001/tes ...

  8. 为啥java要使用 set ()和get()方法---封装

    封装性:属性封装,方法封装,类封装,组件封装等 例如:如果属性没有封装,那么在本类对象之外创建对象后,可以直接访问属性 private关键字,只能在本类中访问,想要在外部访问私有属性,我们需要提供公有 ...

  9. centos7限制普通用户访问单一目录下的单一文件

    要求给开发同事开设一个查看日志的账号,并限制其只能访问该目录下的单一文件 1.先新建账号 useradd loglook passwd loglook 家目录为/home/loglook 2.日志的属 ...

  10. 【转载】[基础知识]【网络编程】TCP/IP

    转自http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=27043 [基础知识][网络编程]TCP/IP iooops  胖友们楼主我又 ...