本篇文章只是对Go语言中代码性能监控(pprof)简单使用的介绍,希望对您们的学习道路上有所帮助,相互学习,共同帮助

注意:本文在Mac Pro下操作为例,基于Go1.12版本
在软件开发的过程中,项目的上线并不是重点。上线之后,还需对程序进行取样分析运行情况,并重构现有的功能,让程序执行的更高效更稳定。
一:pprof基础介绍
1.1 pprof是什么?
pprof是用于可视化和分析性能,数据的工具
pprof 以 profile.proto读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)
profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式
1.2 支持什么使用模式
- Report generation:报告生成
- Interactive terminal use:交互式终端使用
- Web interface:Web 界面
1.3 可以用来干嘛
- CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
- Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
- Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
- Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况
1.4 在go中pprof可以干嘛
go的pprof工具可以用来检测进程的运行数据以及监控程序的性能,对内存使用和CPU使用的情况统计信息进行分析
官方提供包及文档:
包:
- runtime/pprof:用于普通代码的性能分析(采集程序(非Server)的预想数据进行分析)
- net/http/pprof:用于web服务器的性能分析(采集HTTP Server的运行数据进行分析)
文档(有的需翻墙):
pprof
runtime/pprof
net/http/pprof
二: 通过简单的例子来进行描述
package main
import (
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"time"
)
func main() {
// 开启pprof
go func() {
log.Println(http.ListenAndServe("localhost:8087", nil))
}()
go hello()
select {}
}
func hello() {
for {
go func() {
fmt.Println("hello word")
}()
time.Sleep(time.Millisecond * 1)
}
}
运行这个文件
效果截图

分析
2.1通过Web服务器监测
当服务开启成功时(别忘记引入监测包),查看当前信息 ,地址栏中输入http://localhost:8087/debug/pprof/

- cpu(CPU Profiling)
访问地址:ip/debug/pprof/profile
介绍:默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件 - block(Block Profiling)
访问地址:ip/debug/pprof/block
介绍:查看导致阻塞同步的堆栈跟踪 - goroutine
访问地址:ip/debug/pprof/goroutine
介绍:查看当前所有运行的 goroutines 堆栈跟踪 - heap(Memory Profiling)
访问地址:ip/debug/pprof/heap
介绍:查看活动对象的内存分配情况 - mutex(Mutex Profiling)
访问地址:ip/debug/pprof/mutex
介绍:查看导致互斥锁的竞争持有者的堆栈跟踪 - threadcreate
访问地址:ip/debug/pprof/threadcreate
介绍:查看创建新OS线程的堆栈跟踪
2.2 通过交互式终端进行使用
2.2.1
命令:go tool pprof http://localhost:8087/debug/pprof/profile\?seconds\=30
执行该命令后,需等待 30 秒(可调整 seconds 的值),pprof 会进行 CPU Profiling。结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help
命令说明


top
命令格式: top[n],查看排名前n个数据,默认为10

解释
flat:给定函数上运行耗时
flat%:同上的 CPU 运行耗时总比例
sum%:给定函数累积使用 CPU 总比例
cum:当前函数加上它之上的调用运行总耗时
cum%:同上的 CPU 运行耗时总比例
其中最后一列为函数名称,在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,加以优化😊
tree
命令格式:tree[n],以树状图形显示

2.2.2
命令:
go tool pprof http://localhost:8087/debug/pprof/heap

-inuse_space:分析应用程序的常驻内存占用情况
-alloc_objects:分析应用程序的内存临时分配情况
2.3 可视化界面
测试用例可以参照这个
需安装graphviz(谷歌或者百度)
Mac中安装的话
命令:brew install graphviz
启动可视化界面
第一种:go tool pprof -http=:8089 cpu.prof
第二种
$ go tool pprof cpu.prof
$ (pprof) web
若是出现Could not execute dot; may need to install graphviz.,那么需要安装graphviz
查看pprof可视化界面




小结:本篇文章也是自己根据文档已经别人的文章(站在巨人的肩膀上)进行学习的,目前理解的不是很深,文章中有遗漏的地方,欢迎提出,相互学习,共同进步
网友评论