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
打开以下地址,通过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
我们上面的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