pprof

package main

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

func readMemStats() {

    var ms runtime.MemStats

    runtime.ReadMemStats(&ms)

    log.Printf(" ===> Alloc:%d(bytes) HeapIdle:%d(bytes) HeapReleased:%d(bytes)", ms.Alloc, ms.HeapIdle, ms.HeapReleased)
}

func test() {
    //slice 会动态扩容,用slice来做堆内存申请
    container := make([]int, 8)

    log.Println(" ===> loop begin.")
    for i := 0; i < 32*1000*1000; i++ {
        container = append(container, i)
        if ( i == 16*1000*1000) {
            readMemStats()
        }
    }

    log.Println(" ===> loop end.")
}

func main() {


    //启动pprof
    go func() {
        log.Println(http.ListenAndServe("0.0.0.0:10000", nil))
    }()

    log.Println(" ===> [Start].")

    readMemStats()
    test()
    readMemStats()

    log.Println(" ===> [force gc].")
    runtime.GC() //强制调用gc回收

    log.Println(" ===> [Done].")
    readMemStats()

    go func() {
        for {
            readMemStats()
            time.Sleep(10 * time.Second)
        }
    }()

    time.Sleep(3600 * time.Second) //睡眠,保持程序不退出
}

我们正常运行程序,然后同时打开浏览器,

输入地址:http://127.0.0.1:10000/debug/pprof/heap?debug=1

浏览器的内容其中有一部分如下,记录了目前的内存情况:

# runtime.MemStats
# Alloc = 303776
# TotalAlloc = 1293915864
# Sys = 1183450376
# Lookups = 0
# Mallocs = 3604
# Frees = 2607
# HeapAlloc = 303776
# HeapSys = 1140293632
# HeapIdle = 1139179520
# HeapInuse = 1114112
# HeapReleased = 981983232
# HeapObjects = 997
# Stack = 557056 / 557056
# MSpan = 72488 / 81920
# MCache = 9600 / 16384
# BuckHashSys = 1449465
# GCSys = 39160888
# OtherSys = 1891031
# NextGC = 4194304
# LastGC = 1617287225223657000

CPU性能

打开以下地址,通过profile信息查看cpu的性能.

http://localhost:10000/debug/pprof/profile?debug=1 有关profile下面的英文解释大致如下:

“CPU配置文件。您可以在秒GET参数中指定持续时间。获取概要文件后,请使用go tool pprof命令调查概要文件。”

就是要获取到当前进程的profile文件,这个文件默认是30s生成一个,所以你的程序要至少运行30s以上(这个参数也可以修改)

我们可以直接点击网页的profile,浏览器会给我们下载一个profile文件. 然后使用pprof工具查看:

go tool pprof [binary] [profile]

binary: 必须指向生成这个性能分析数据的那个二进制可执行文件;

profile: 必须是该二进制可执行文件所生成的性能分析数据文件。

binary 和 profile 必须严格匹配。

help可以查看一些指令,我么可以通过top来查看cpu的性能情况.

go tool pprof ./demo profile
(pprof) top
  • flat:当前函数占用CPU的耗时
  • flat%::当前函数占用CPU的耗时百分比
  • sun%:函数占用CPU的耗时累计百分比
  • cum:当前函数加上调用当前函数的函数占用CPU的总耗时
  • cum%:当前函数加上调用当前函数的函数占用CPU的总耗时百分比
  • 最后一列:函数名称

通过go tool pprof得到profile文件

我们上面的profile文件是通过web浏览器下载的,这个profile的经过时间是30s的,默认值我们在浏览器上修改不了,如果你想得到时间更长的cpu利用率,可以通过go tool pprof指令与程序交互来获取到

首先启动程序:

./demo

然后再打开一个终端

go tool pprof http://localhost:10000/debug/pprof/profile?seconds=60

这里制定了生成profile文件的时间间隔60s

等待60s之后, 终端就会有结果出来,我们继续使用top来查看.

可视化查看

进入profile文件查看,然后我们输入web指令,然后我们得到一个svg的可视化文件,这样可以清晰的看到函数之间的调用关系,方块越大的表示cpu的占用越大。

go tool pprof ./demo profile
(pprof) web

这里如果报找不到graphviz工具,需要安装一下:

brew install graphviz