• 爱上开源之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程序 - 采集数据保存到指定的文件路径

    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. "runtime/pprof"
    6. )
    7. /**
    8. Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
    9. */
    10. func main() {
    11. var cpuprofile = "test-prof"  // 指定保存的文件路径,当前目录的test-prof文件
    12. f, err := os.Create(cpuprofile)
    13. if err != nil {
    14. panic(err)
    15. }
    16. // StartCPUProfile为当前进程开启CPU profile。
    17. if err := pprof.StartCPUProfile(f); err != nil {
    18. panic("could not start CPU profile: ")
    19. }
    20. // StopCPUProfile会停止当前的CPU profile(如果有)
    21. defer pprof.StopCPUProfile()
    22. sum := 0
    23. for i := 0; i < 100; i++ {
    24. sum += i
    25. }
    26. fmt.Printf("sum=%d\n", sum)
    27. }

    运行程序

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

     

    或者

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

    1. E:>cd E:\WORK\PROJECT\git\go\golang-sample\Demo
    2. 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'

    1. func init() {
    2. http.HandleFunc("/debug/pprof/", Index)
    3. http.HandleFunc("/debug/pprof/cmdline", Cmdline)
    4. http.HandleFunc("/debug/pprof/profile", Profile)
    5. http.HandleFunc("/debug/pprof/symbol", Symbol)
    6. http.HandleFunc("/debug/pprof/trace", Trace)
    7. }

     

    技巧

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

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

    3.4.4 性能分析

  • 相关阅读:
    文字转语音:语音合成(Speech Synthesis) 数组文字循环播放
    Workfine新手入门:日期间隔函数范围判断
    java毕业设计台球厅自助管理系统mybatis+源码+调试部署+系统+数据库+lw
    SpringMVC:整合SSM
    计算机毕设 SpringBoot+Vue校园博客系统 博客管理系统 开源博客系统 个人博客系统Java Vue MySQL数据库 远程调试 代码讲解
    【Redis】CentOs 虚拟机安装 Redis 缓存数据库
    C++由于错误使用下标运算符引发的未定义错误
    【DS】算法的时间复杂度与空间复杂度
    React中实现大模型的打字机效果
    科技公司网络规划与设计
  • 原文地址:https://blog.csdn.net/inthirties/article/details/125519731