爱上开源之golang入门至实战第三章-性能分析PPROF_golang

 

3.4 性能分析工具(PPROF)

如同上一节内容介绍的,不论哪种语言,我们在进行开发的时候,都必须致力于能够尽可能的提升程序的运行效率和稳定。Golang提供了工具包PPROF(Program Profiling),Golang Pprof是一种对golang开发的程序进行可视化和分析性能数据的工具。

3.4.1 工作原理

性能分析的工作原理大致上都是类似的;从过程上都包括两个部分

  • 性能数据样本采集
  • 样本数据的分析

golang pprof也由这两个过程组成,不同的过程,由不同的组成部分实现;在性能数据样本采集的过程中;golang pprof通过在运行程序中引入pprof包,并进行相关调用的方式,搜集被分析程序在运行时刻一系列的性能概要信息的采样数据。并根据产生的采样数据生成proto格式的性能采集报告,采集数据报告里包含调用堆栈信息以及性能样本。我们可以对照golang里的​​"runtime/pprof"​​​包和​​“net/http/pprof"​​源代码, 可以了解到采集报告里数据格式;这个过程可以称为性能数据样本收集。

golang pprof提供命令行工具,可以对采集到的样本数据,进行可视化和性能数据分析。

golang提供了两种性能数据样本收集和分析方式,

  • 本地文件保存;在pprof采集性能数据样本时,直接把数据保存到指定的文件地址,这种方式比较适合run once的应用程序,程序运行时,保存到文件,程序运行结束后,使用pprof分析工具从本地文件进行分析。
  • http方式; 对于一些后台服务或者是web服务的程序,上面的这种方式就不适用了;pprof提供了另一种方式,通过http传输的方式;进行数据的采集和分析,在需要进行分析的服务里,pprof内置了一个http的处理模块,访问该模块对应的http接口,就可以获取到采集的性能数据样本,pprof工具指定需要获取的http接口,就可以进行后台服务和web服务的性能数据分析了

3.4.2 安装

  • 安装pprof分析工具(分析工具,命令行可以执行)

go install github.com/google/pprof@latest


  • 安装Graphviz;这是个可选安装;如果需要图形化的展示分析结果,就必须安装此软件,并配置到相关路径,pprof的图形化分析依赖此组件

在http://www.graphviz.org/ 官方网站进行下载;window下用户在网上下载 windows_10_cmake_Release_graphviz-install-3.0.0-win64.exe


有关图形化

由于网络问题,可能导致Graphviz的下载出现问题,而无法成功的进行安装;也无法使用pprof的图形化的功能;

图形化是把数字和关系通过图像的方式,展示出来,里面的数据信息显示和pprof的可视化内容一样;所以相对于图形化而言,最重要的还是要会看pprof里各项数据指标所表达出来的含义;以及其所对应反馈出来的问题;而这种重要的两点,图形化也无法展示;

没有安装好Graphviz完全没有什么实质性的损失;数据才是真正的本质。

3.4.3 采集数据

在前面一节讲解pprof的原理,就提到过, pprof的数据采集方法根据不同场景的提供了两种方式

  • Run Over Once程序 - 采集数据保存到指定的文件路径
package main

import (
"fmt"
"os"
"runtime/pprof"
)

/**
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
*/

func main() {

var cpuprofile = "test-prof" // 指定保存的文件路径,当前目录的test-prof文件

f, err := os.Create(cpuprofile)
if err != nil {
panic(err)
}
// StartCPUProfile为当前进程开启CPU profile。
if err := pprof.StartCPUProfile(f); err != nil {
panic("could not start CPU profile: ")
}
// StopCPUProfile会停止当前的CPU profile(如果有)
defer pprof.StopCPUProfile()

sum := 0
for i := 0; i < 100; i++ {
sum += i
}
fmt.Printf("sum=%d\n", sum)
}

运行程序

如图在Idea中,在main方法处,右键菜单,点击->Run ....

爱上开源之golang入门至实战第三章-性能分析PPROF_图形化_02

 

或者

在命令行里, 进入源文件目录,运行

E:>cd E:\WORK\PROJECT\git\go\golang-sample\Demo
E:\WORK\PROJECT\git\go\golang-sample\Demo> go run .\hello.go




验证数据样本文件已经产生

在当前文件下,产生如程序里指定的test-prof文件

爱上开源之golang入门至实战第三章-性能分析PPROF_后端_03

 

Run Along Service(后台服务或者web服务) -- 通过Http的方式提供采集数据源

这种方式是专门针对后台运行或者长时间运行的服务类程序,这类方式,通过提供http形式的性能样本数据采集源;实时提供样本数据,外部分析工具,通过以http方式从其获取性能数据样本

在golang里提供了net/http/pprof的包,来适用于这种方式,只需要引入该包,启动默认的ServerMetux就可以实现该方式的采集

引入包

import  _ "net/http/pprof"

启动默认的ServerMetux

http.ListenAndServe("0.0.0.0:8887", nil)

查看http提供的地址 ​​http://serverip:port/debug/pprof/​

爱上开源之golang入门至实战第三章-性能分析PPROF_图形化_04

 

如果需要把PProf的功能加入到自己的Metux里,可以直接参考golang的pprof代码,代码包​​net/http/pprof​​​下 源文件​​'net/http/pprof/pprof.go'​

func init() {
http.HandleFunc("/debug/pprof/", Index)
http.HandleFunc("/debug/pprof/cmdline", Cmdline)
http.HandleFunc("/debug/pprof/profile", Profile)
http.HandleFunc("/debug/pprof/symbol", Symbol)
http.HandleFunc("/debug/pprof/trace", Trace)
}

爱上开源之golang入门至实战第三章-性能分析PPROF_开发语言_05

 

​技巧​

默认的ServerMetux就可以开启PProf,如果是自己定制的ServerMetux;进行包装后才能实现

Idea有非常友好的代码浏览功能;用来看源代码非常的方便

3.4.4 性能分析