进入分析界面
 // 直接使用 http/pprof方式,也是最常用的方式
go tool pprof 
//也可以使用离线方式,效果时一样的
curl -s  > cpu.prof
go tool pprof cpu.prof  
常用的几种分析方法
  • top(N) 查看热点函数

N可以随意选择,会把CPU占用最大的前N个函数列举出来,如下图:

其中各列的含义如下,可以根据这些值做对应的分析:

flat :当前函数的执行时间,示例中是250ms。

flat% :当前函数执行占总时间比。示例中进程总耗时是600ms,占比为60.98%。

sum% :每行的sum%是当前行的flat% 加上当前行之前的行的所有flat%的总和,比如第一行为本身的flat%,第二行为当前行的flat%+第一行的flat%。是个统计值,能够看出topN函数占总耗时的比例。比如第二行的sum%=90.24%,说明topN中前两个函数总耗时占CPU总时间的90.24%,占比非常大了。

cum : 是指当前函数及其调用函数的总时间,示例中是340ms。比如a函数调用b函数,然后自身处理部分业务。那cum就是自身业务耗时加b函数从调用到返回的时间。和flat对比就可以看出flat内部函数调用具体耗时位置。

cum% : 同理cum%指cum占总时间的占比,实例中是82.93%。


  • 在上图的命令行中还有以下命令

介绍几种常用的命令:

可以可视化的看出函数间的调用关系。web、dot、eog、evince、gif、pdf、png等都是直接输出可视化的调用关系图。只是格式不同,具体可以参考help。每个字命令也可以通过help xx 查看使用方法。

可视化的调用关系图可以直观地看到每个函数的调用关系,以及CPU使用情况:

其中:白色方框中是整体信息,包含采集周期内的总耗时、采集时间戳等。

每个红色方框中,代表当前函数。

方框中的时间指当前函数占用的CPU时间,比例为占用总耗时的比例;

每个线条箭头上的数字表示调用者从调用函数到被调用函数返回的总耗时。比如图中第一个main函数调用demo函数耗时350ms,其中demo函数耗时10ms,demo函数又调用其他函数耗时为340ms,加起来的就是350ms。以此内推。如果红框中没有时间,表明当前函数直接调用了其他函数,没有耗时或者耗时不足以统计。其实可以看出和top命令很类似。不过能直观看出函数调用关系。 线条上也标记了inline调用的类型;

颜色越深,表明函数占用CPU时间越多。

火焰图

以上介绍的工具命令已经能够较直观的进行分析了。golang还有一种神器,更加直观的展示CPU占用的关系。使用方法如下:

  • 安装依赖工具
 //安装go-torch 可以选择对应的版本,安装好之后确保$GOPATH/bin在系统$PATH环境变量中
//,或直接拷贝go-torch 到/usr/bin目录下。windows环境可以直接添加环境变量。
go install github.com/uber/go-torch@latest
// 安装 FlameGraph
// 把 FlameGraph 路径添加到$PATH下,这是个perl写的项目
git clone  github.com/brendangregg/FlameGraph.git
// 安装 graphviz,官网有各平台的安装方法
   
  • 生成火焰图

使用 go-torch -u ,默认是采集30s,也可以加-t 指定时间。具体可以看go-torch help。 下图可以点击每个色块看具体情况。

同样也可以通过离线的cpu.prof文件来产生火焰图,如果生产环境不能安装go-torch工具的话,可以采用这种方式。

 // 首先通过pprof 工具产生cpu.prof文件
curl -s  > cpu.prof
// 然后 利用go-torch工具生成或沿途
go-torch -b cpu.prof  

利用pprof分析CPU占用就介绍到这里,每个业务代码优化cpu的问题不尽相同,排查到热点函数之后就可以有针对性的优化。