Go语言 CPU 性能、内存分析调试方法大汇总:你要的都在这

本篇介绍Golang常用性能调试工具的应用场景 , 包括:场景1
如何分析程序的运行时间与CPU利用率情况?
场景2
如何分析Golang程序的内存使用情况?
场景3
如何分析Golang程序的CPU性能情况?
场景1、如何分析程序的运行时间与CPU利用率情况?
01
shell内置time指令
这个方法不算新颖 , 但是却很实用 。time是Unix/Linux内置多命令 , 使用时一般不用传过多参数 , 直接跟上需要调试多程序即可 。 $ time go run test2.go i < 32*1000*1000; i++ {container = append(container, i)}log.Println(" ===> loop end.")}func main() {log.Println("Start.")test()log.Println("force gc.")runtime.GC() //强制调用gc回收log.Println("Done.")time.Sleep(3600 * time.Second) //睡眠 , 保持程序不退出}编译
$go build -o snippet_memi < 32*1000*1000; i++ {container = append(container, i)if ( i == 16*1000*1000) {readMemStats()}}log.Println(" ===> loop end.")}func main() {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) //睡眠 , 保持程序不退出}这里我们 ,封装了一个函数readMemStats() , 这里面主要是调用runtime中的ReadMemStats()方法获得内存信息 , 然后通过log打印出来 。
我们执行一下代码并运行
$ go run demo2.go2020/03/02 18:21:17===> [Start].2020/03/02 18:21:17===> Alloc:71280(bytes) HeapIdle:66633728(bytes) HeapReleased:66600960(bytes)2020/03/02 18:21:17===> loop begin.2020/03/02 18:21:18===> Alloc:132535744(bytes) HeapIdle:336756736(bytes) HeapReleased:155721728(bytes)2020/03/02 18:21:38===> loop end.2020/03/02 18:21:38===> Alloc:598300600(bytes) HeapIdle:609181696(bytes) HeapReleased:434323456(bytes)2020/03/02 18:21:38===> [force gc].2020/03/02 18:21:38===> [Done].2020/03/02 18:21:38===> Alloc:55840(bytes) HeapIdle:1207427072(bytes) HeapReleased:434266112(bytes)2020/03/02 18:21:38===> Alloc:56656(bytes) HeapIdle:1207394304(bytes) HeapReleased:434266112(bytes)2020/03/02 18:21:48===> Alloc:56912(bytes) HeapIdle:1207394304(bytes) HeapReleased:1206493184(bytes)2020/03/02 18:21:58===> Alloc:57488(bytes) HeapIdle:1207394304(bytes) HeapReleased:1206493184(bytes)2020/03/02 18:22:08===> Alloc:57616(bytes) HeapIdle:1207394304(bytes) HeapReleased:1206493184(bytes)c2020/03/02 18:22:18===> Alloc:57744(bytes) HeapIdle:1207394304(bytes) HeapReleased:1206493184(by可以看到 , 打印[Done].之后那条trace信息 , Alloc已经下降 , 即内存已被垃圾回收器回收 。 在2020/03/02 18:21:38和2020/03/02 18:21:48的两条trace信息中 , HeapReleased开始上升 , 即垃圾回收器把内存归还给系统 。
另外 , MemStats还可以获取其它哪些信息以及字段的含义可以参见官方文档:#MemStats
04
pprof工具
pprof工具支持网页上查看内存的使用情况 , 需要在代码中添加一个协程即可 。
import("net/http"_ "net/http/pprof")go func() {log.Println(http.ListenAndServe("0.0.0.0:10000", nil))}()具体添加的完整代码如下:
代码demo3.go
package mainimport ("log""runtime""time""net/http"_ "net/http/pprof")func readMemStats() {var ms runtime.MemStatsruntime.ReadMemStats( i < 32*1000*1000; i++ {container = append(container, i)if ( i == 16*1000*1000) {readMemStats()}}log.Println(" ===> loop end.")}func main() {//启动pprofgo 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) //睡眠 , 保持程序不退出}我们正常运行程序 , 然后同时打开浏览器 ,
输入地址:
浏览器的内容其中有一部分如下 , 记录了目前的内存情况
# ...# runtime.MemStats# Alloc = 228248# TotalAlloc = 1293696976# Sys = 834967896# Lookups = 0# Mallocs = 2018# Frees = 671# HeapAlloc = 228248# HeapSys = 804913152# HeapIdle = 804102144# HeapInuse = 811008# HeapReleased = 108552192# HeapObjects = 1347# Stack = 360448 / 360448# MSpan = 28288 / 32768# MCache = 3472 / 16384# BuckHashSys = 1449617# GCSys = 27418976# OtherSys = 776551# NextGC = 4194304# LastGC = 1583203571137891390# ...场景3、如何分析Golang程序的CPU性能情况?
01
性能分析注意事项
Go语言 CPU 性能、内存分析调试方法大汇总:你要的都在这文章插图
注意
性能分析注意事项
性能分析必须在一个可重复的、稳定的环境中来进行 。