注: 每天进步一点点,记录每日成长,思考的第01/365天 ;
本文预计阅读时间: 5分钟
1.pprof是什么
程序在迭代发布后不久后就出现了应用程序无法提供服务的问题,这是为什么呢?这时,就该主角出场了,没错,就是我们的救火英雄——pprof。pprof 是用于可视化的数据性能分析工具。
线下可以通过模拟流量进行压测,那么到了线上又怎么做呢?线上如果遇到大流量,突发的尖峰流量这些情况,可能会导致线上报警,接口超时,错误数增加,我们除了看日志、监控,就是用性能分析工具分析程序的性能,找到瓶颈了。
但是,一帮情况,这种情况是不会有机会让你去分析的,降级、限流、回滚才是首要的,要学会及时止损。回归正常之后,通过线上流量回放,或者压测等手段,制造性能问题,再通过工具来分析系统的瓶颈。
性能分析主要关注CPU、内存、磁盘 IO、网络这些指标。
2.Go自带的pprof相关的库有两个:
1)runtime/pprof:采集程序指定区块的运行数据进行分析 ( 应用无web交互 );
2)net/http/pprof:采集服务服务型应用运行时数据进行分析。
3.pprof 的作用
例子:(以net/http/pprof举例)
package main
import (
"net/http"
_ "net/http/pprof"
)
func main(){
err :=http.ListenAndServe(":9909",nil)
if err != nil {
panic(err)
}
}
复制
3.1 web方式交互:(下载文件再交互)
访问 http://localhost:9909/debug/pprof/ ,就可以看到监控页面了。
类型 | 描述 |
---|---|
allocs | 所有过去内存分配的采样信息(所有对象) |
blocks | 阻塞操作情况的采样信息(用于记录 goroutine 在等待共享资源花费的时间) |
cmdline | 当前程序的命令行的完整调用路径goroutine,显示程序启动命令参数及其参数 |
goroutine | 显示当前所有协程的堆栈信息 |
heap | 堆上的内存分配情况的采样信息(活跃对象) |
mutex | 锁竞争情况的采样信息 |
profile | cpu占用情况的采样信息,点击会下载文件 |
threadcreate | 系统线程创建情况的采样信息 |
trace | 程序运行跟踪信息 |
注意:
由于内存分析是取样方式,并且也因为其记录的是分配内存,而不是使用内存。因此使用内存性能分析工具来准确判断程序具体的内存使用是比较困难的。
3.2. 打开另外一个终端查看信息:
【查看可用命令用help:go tool pprof -help】
( 直接使用命令,不需要通过点击浏览器上的链接就能进入命令行交互模式:
go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=60 )
分析:这个命令的作用是追踪上面代码60秒内CPU的消耗情况,执行该命令后,需要等待60秒(可自己调整,默认30s),60秒到达后默认进入pprof交互式命令行中。
pprof交互式常用的命令有:top,list,web
列名 | 含义 |
---|---|
flat | 本函数的执行耗时 |
flat% | flat(本函数) 占 CPU 运行耗时占比 |
sum% | 给定函数累积使用CPU总比例 |
cum | 累计量。指该函数加上该函数调用的函数总耗时 |
cum% | 当前函数加上他之前的调用CPU运行耗时占比(cum 占 CPU 总时间的比例) |
3.3 可视化界面:(需要安装graphviz)
上面的web界面中有一行profile,点击之后会下载一个profile文件A。下载之后,把这个A文件放入项目运行目录之下。有两种方式可视化:
1)go tool pprof ./A文件,之后进入交互控制台,输入web命令产生一个svg文 件,浏览器自动打开这个文件。
2)go tool pprof --http=:8080 ./A文件,然后浏览器会直接打开localhost:8080访问。(此方式体验更好)
想要生成火焰图,必须安装 graphviz。
在 Mac 上:
brew install graphviz
复制
在 Ubuntu 上:
apt install graphviz
复制
在 Windows 上:
官网下载页http://www.graphviz.org/download/有可执行安装文件,下载安装即可。注意设置 PATH 路径。
也可以下载其他的库查看火焰图,例如:
go get -u github.com/google/pprof
或者
go get github.com/uber/go-torch
复制
1
总结:
得到性能数据后,可以使用top、 web、 list等命令快速定位到相应的代码处,然后进行优化。