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

 

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 ....

 

或者

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

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 性能分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值