zoukankan      html  css  js  c++  java
  • go 程序性能调优 pprof 的使用 (二)

    上一篇说了以命令行方式执行了pprof,这次我们学习以web方式运行pprof. 下面看个例子:

    var datas []string
    func main() {
       go func() {
          for  {
             log.Printf("len:%d",Add("gwyy"))
             time.Sleep(time.Second)
          }
       }()
       go func() {
          for  {
             Get()
             time.Sleep(time.Second)
          }
       }()
       _ = http.ListenAndServe(":6060",nil)
    }
    func Add(str string) int {
       data := []byte(str)
       datas = append(datas,string(data))
       return len(datas)
    }
    func Get() {
       res,_ :=http.Get("https://www.baidu.com/")
       defer res.Body.Close()
       body,_ := ioutil.ReadAll(res.Body)
       log.Println(body)
    }
    

      

    然后执行命令:

    wget http://127.0.0.1:6060/debug/pprof/profile     
    

      

    默认需要等待30秒,执行完毕后当前目录下有个采集profile文件,针对可视化界面,可以进行下一步分析的方法有两种:
     
    方法1 (推荐)该命令将在指定端口号运行一个PProf分析用的页面

    go tool pprof -http=:6001 profile 
    

      

    方法2 通过web命令将profile文件以svg的文件格式写入图形,然后在web浏览器中将其打开

    PS D:> go tool pprof profile                                                                                           
    Type: cpu
    Time: Oct 13, 2020 at 12:49am (CST)
    Duration: 30s, Total samples = 20ms (0.067%)
    Entering interactive mode (type "help" for commands, "o" for options)
    (pprof) web
    (pprof)   
    

      如果出现错误 “Could not execute dot; may need to install graphviz” 那么要安装 graphviz组件

    解析内容

    通过PProf提供的可视化界面,我们能够更方便、更直观的看到go应用程序的调用链和使用情况等,另外在View菜单栏,PProf还支持多种分析方式切换

    Top视图如图:

    该视图与命令行下面的 top 命令作用和含义一样
     

    Graph视图如图:

    该视图展示的是整体的函数调用流程,框越大,线越粗,框颜色越鲜艳(红色),代表它占用时间越久,开销越大,相反框越小,颜色越浅,框颜色越淡,代表开销越小
     

    Peek视图如图:

    此图与top视图相比,增加了所属上下文信息的展示,既函数的输出调用者和被调用者
     

    Source 视图如图:

    该视图主要增加了面向源代码的追中和分析,可以看到其开销主要消耗在哪里
     

    Flame Graph 视图如图

    Flame Graph (火焰图)是动态的,调用顺序由上而下,(A->B->C->D) 每一快代表一个函数,颜色越鲜艳(红),区块越大,代表占CPU的时间越长,同时它还支持点击块进行深入分析。

    这样就可以根据不同函数的多维度进行分析了,能够更好的观察其流转并发现问题。

  • 相关阅读:
    Kotlin基本语法笔记3之定义类、继承及创建实例
    Kotlin基本语法笔记2之类型检测及自动类型转换、循环
    Kotlin基本语法笔记之函数、变量的定义及null检测
    C++笔记之外部类访问内部类的私有成员
    正则表达式之不区分大小写的匹配
    springMVC之helloworld
    数组学习
    反射reflect
    JSP学习
    自己做的菜
  • 原文地址:https://www.cnblogs.com/gwyy/p/13807374.html
Copyright © 2011-2022 走看看