如同上一节内容介绍的,不论哪种语言,我们在进行开发的时候,都必须致力于能够尽可能的提升程序的运行效率和稳定。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 ....
或者
在命令行里, 进入源文件目录,运行
- E:>cd E:\WORK\PROJECT\git\go\golang-sample\Demo
- E:\WORK\PROJECT\git\go\golang-sample\Demo> go run .\hello.go
验证数据样本文件已经产生
在当前文件下,产生如程序里指定的test-prof文件
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/
如果需要把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)
- }
技巧
默认的ServerMetux就可以开启PProf,如果是自己定制的ServerMetux;进行包装后才能实现
Idea有非常友好的代码浏览功能;用来看源代码非常的方便
3.4.4 性能分析