应用程序在运行时,总是会出现一些意料不到的问题,如CPU使用率过高、内存占用不断增大(疑似泄露),又或是Goroutine泄露、出现Goroutine数量暴涨,以及网络连接数过多等。本文分享pprof工具,用于日常Golang组件排障,提供辅助分析。
01
PProf简介
在Go语言中,PProf是用于可视化和应用程序性能数据分析的工具,PProf以profile.proto读取分析样本的集合,并生成可视化报告(支持文本和图形报告),帮助分析数据。
1、采样方式
目前有三种采用方式:
runtime/pprof:用于非Server端的程序的运行数据采集。
net/http/pprof:通过运行测试用例,并指定所需标识来进行采集。
go test:通过运行测试用例,并指定所需标识来进行采集。
2、性能分析输出模式
性能数据分析输出模式有三种:
Report generation:报告生成。
Interactive terminal use:交互式终端。
Web interface:Web界面。
3、采样数据范围
采样数据范围如下:
CPU Profiling:CPU分析,按照一定的频率采集所监听的应用程序CPU(含寄存器)的使用情况。
Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏。
Block Profiling:阻塞分析,记录Goroutine阻塞等待同步(包括定时器通道)的位置,默认不开启,需要调用runtime.SetBlockProfileRate进行设置。
Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况,默认不开启,需要调用runtime.SetMutexProfileFraction进行设置。
Goroutine Profiling:Goroutine分析,可以对当前应用程序正在运行的Goroutine进行堆栈跟踪和分析。这项功能在实际排查中会经常用到,因为很多问题出现时的表象就是Goroutine暴增,而这时候要做的事情之一就是查看应用程序中的Goroutine正在做什么事情,为什么阻塞了,然后再进行下一步。
02
程序中启动PProf
go tool已经集成在go命令行工具中,因此无需额外安装,使用PProf最重要的一步就是在你的应用程序中引入"net/http/pprof"包,然后为查询pprof采样结果启动一个服务端口,pprof包的init函数会将多个采样处理程序注册到该地址的debug子路由下。
示例程序:
package main
import (
_ "net/http/pprof"
)
func main() {
// 启动一个 pprof http server
if err := http.ListenAndServe(":6060", nil); err != nil {
panic(err.Error())
}
}
03
PProf分析结果展示
1、浏览器查看性能分析
启动一个使用PProf采样的程序后,我们可以通过浏览器查看其采样结果。在http://127.0.0.1:$(Your_port)/debug/pprof/路径下,首先是一个总览界面:
图3-1 浏览器访问性能分析结果
profile类型如下:
allocs:查看过去所有内存分配的样本,访问路径为$HOST/debug/pprof/allocs。
block:查看导致阻塞同步的堆栈跟踪,访问路径为$HOST/debug/pprof/block。
cmdline:当前程序的命令行的完整调用路径。
goroutine:查看当前所有运行的goroutines堆栈跟踪,访问路径为$HOST/debug/pprof/goroutine。
heap:查看活动对象的内存分配情况,访问路径为$HOST/debug/pprof/heap。
mutex:查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为$HOST/debug/pprof/mutex。
profile:默认进行30s的CPU Profiling,得到一个分析用的profile文件,访问路径为$HOST/debug/pprof/profile。
threadcreate:查看创建新OS线程的堆栈跟踪,访问路径为$HOST/debug/pprof/threadcreate。
对于以上几种profile可以通过$HOST/debug/pprof/ + profile类型+ ?debug=1直接访问,如果不加?debug=1参数,就会直接下载其对应的profile,这在一些需要使用curl、wget获取profile文件的场景中有用。debug的访问方式是具有时效性的,在实际场景中,常常需要及时将当前状态下的profile文件存储下来,便于二次分析。
2、交互式终端查看性能分析
通过命令行查看PProf的抓取和分析。多种类型的profile方式类似,以cpu profile为例。
命令:
go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=60
通过执行该命令(需要等待60秒),pprof会进行CPU Profiling,采样60s的CPU使用情况,结束后进入pprof的命令行交互模式,你可以通过命令行操作对分析的结果进行查看或导出。
图3-2 go tool交互终端访问性能分析结果
可以通过输入top命令查看CPU占用降序排列的各个函数。如下图所示:
图3-3 top命令
可以输入pdf生成pdf格式的图形报告:
图3-4 pdf命令
图3-5 pdf文件
3、profile文件Web界面展示
PProf还支持通过web界面查看和分析采样结果。首先执行以下命令获取某一类profile:
wget http://127.0.0.1:6060/debug/pprof/profile
默认需要等待30秒,执行完毕后可在当前目录下发现采集的文件profile,可视化后支持多种分析方式且更简单易用。
注意:使用PProf的可视化分析功能需要安装Graphviz组件,否则会报错“Could not execute dot; may need to install graphviz”。
执行命令:
go tool pprof -http=:6001 profile,
该命令将在所指定的端口号运行一个PProf的分析用的站点。生成的可视化页面支持多种分析方式,如下:
图3-6 性能分析可视化ui
选择对应的Top、Graph、Flame、Peek,打开即可查看图形化的性能分析数据。
关注我们
文章作者|曹伍
原文始发于微信公众号(EBCloud):GO性能分析工具-PProf
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论