其他分享
首页 > 其他分享> > pprof CPU性能测试

pprof CPU性能测试

作者:互联网

基本介绍

pprof 是在做性能优化前的性能分析工具。

安装: go get -u github.com/google/pprof

分析工具

go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。

两种应用

服务型应用场景中因为应用要一直提供服务。所以 pprof 是通过 API 访问来获取,pprof 使用了默认的 http.DefaultServeMux 挂在这些 API 接口。开发者也可以手动注册路由规则挂载 API,如 r.HandleFunc("/debug/pprof/debugopen", openFunc)

工具性应用是一个提供特定功能使用的工具,使用完就会退出进程的应用。开发者手动控制把 profile 文件保存到报告文件中。

封装了接口可以调用,如要进行 CPU Profiling,则调用 pprof.StartCPUProfile(w io.Writer) 写入到 w 中,停止时调用 StopCPUProfile();要获取内存数据,直接使用 pprof.WriteHeapProfile(w io.Writer) 函数则可。

可以做?

可以做( $host/debug/pprof/$type, $type 即下方列表的英文单词):

基本使用

(初学,以下暂时均以 net/http/pprof 使用为例)

  1. 编写 Demo 文件 demo.go,运行这个文件
package main

import (
    "log"
    "net/http"
    _ "net/http/pprof"
)

func main() {
    go func() {
        for {
            log.Println(Add("Hello world"))
        }
    }()

    http.ListenAndServe("0.0.0.0:6060", nil)
}

var datas []string

func Add(str string) string {
    data := []byte(str)
    sData := string(data)
    datas = append(datas, sData)

    return sData
}

通过 Web API 分析

注:网页点击一些链接会下载文件,这些文件应该是需要专用工具才能打开查看分析,如 profile;而且默认采样时长 30s

通过 dump 文件进行分析

通过 dump 文件进行分析可以在命令行中交互式分析,也可以通过浏览器进行可视化分析。

可输入 help 查看可用命令,输入 o 查看可用选项。没多用这里就不再介绍。

CPU profile 的 top 命令

在 CPU profile 交互页面输入 topN 可以查看 top N 的概况(N 可省略,默认为 10)

(pprof) top
Showing nodes accounting for 29.92s, 94.56% of 31.64s total
Dropped 117 nodes (cum <= 0.16s)
Showing top 10 nodes out of 33
      flat  flat%   sum%        cum   cum%
    28.52s 90.14% 90.14%     28.58s 90.33%  runtime.cgocall
     0.81s  2.56% 92.70%      0.82s  2.59%  runtime.stdcall1
     0.24s  0.76% 93.46%      0.25s  0.79%  runtime.stdcall3
     0.16s  0.51% 93.96%     29.10s 91.97%  internal/poll.(*FD).writeConsole
     0.05s  0.16% 94.12%     29.28s 92.54%  internal/poll.(*FD).Write
     0.04s  0.13% 94.25%      0.18s  0.57%  runtime.findrunnable
     0.03s 0.095% 94.34%      0.18s  0.57%  runtime.mallocgc
     0.03s 0.095% 94.44%      0.25s  0.79%  runtime.mcall
     0.02s 0.063% 94.50%     29.49s 93.20%  log.(*Logger).Output
     0.02s 0.063% 94.56%     29.71s 93.90%  log.Println
(pprof)

信息:

heap profile 的 top 命令

go tool pprof http://localhost:6060/debug/pprof/heap

$ go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in C:\Users\xxxxxx\pprof\pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Type: inuse_space
Time: Jun 17, 2020 at 3:52pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
(pprof) top
Showing nodes accounting for 10.04GB, 100% of 10.04GB total
      flat  flat%   sum%        cum   cum%
   10.04GB   100%   100%    10.04GB   100%  main.Add
         0     0%   100%    10.04GB   100%  main.main.func1
(pprof)

启用可视化界面进行分析

需要安装 graphviz,参考:Graphviz安装及简单使用

看懂这些菜单中的信息很重要,你可以知道中这个页面能做到什么,本人中调查过程中就没有注意这个问题,浪费了很多时间,到后面才后知后觉。

  pprof菜单项
- VIEW 看各种视图
  - Top:主要看占用内存当排名信息
  - Graph:主要看调用关系图,并且通过框框的粗细、颜色当深浅、线的实虚、以及数字信息包括执行时间和占比
  - Flame Graph:火焰图,要看宽度和深度,heap 中宽度表明内存占用大小,
  - Peek
  - Source
  - Disassemble
- SAMPLE:采样信息,包括申请对象、申请空间、占用对象、占用空间的信息
- REFINE:可以精细化视图中的信息
  - Focus:聚焦在选中元素的上下游元素
  - Ignore:忽略选中当元素,包含其后继元素
  - Hide:隐藏选中当元素,但不会隐藏其后继元素
  - Show:只显示选中的元素,不包含后继元素
  - Show from:从选中当某一个元素开始,只列出其后继元素
- CONFIG:能将当前已精细化的页面保存起来

对比两个文件差异

可以使用 go tool pprof -http=:9092 -base 0713_1544_heap 0715_1439_heap 对比两个文件,并通过浏览器打开。很实用。

火焰图

标签:profile,调用,http,pprof,火焰,测试,go,CPU
来源: https://www.cnblogs.com/jeffery-pan/p/15494741.html