当前位置:首页 > 技术分析 > 正文内容

Golang使用pprof分析CPU占用_golang性能分析工具

ruisui885个月前 (02-07)技术分析21

接上文pprof基本使用,本篇详细介绍利用pprof 分析cpu使用情况。

进入分析界面

// 直接使用 http/pprof方式,也是最常用的方式
go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30
//也可以使用离线方式,效果时一样的
curl -s http://localhost:8080/debug/pprof/profile?seconds=30 > 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,官网有各平台的安装方法
https://graphviz.org/download/ 
  • 生成火焰图

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

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

// 首先通过pprof 工具产生cpu.prof文件
curl -s http://localhost:8080/debug/pprof/profile?seconds=30 > cpu.prof
// 然后 利用go-torch工具生成或沿途
go-torch -b cpu.prof

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

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1747.html

标签: pprof
分享给朋友:

“Golang使用pprof分析CPU占用_golang性能分析工具” 的相关文章

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。那么组件间如何通信,也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信。转载链接:https://www.jia...

迁移GIT仓库并带有历史提交记录

迁移git仓库开发在很多时候,会遇到一个问题。GIT仓库的管理,特别是仓库的迁移。我需要保留已有的历史记录,而不是重新开发,重头再来。我们可以这样做:使用--mirror模式会把本地的分支都克隆。// 先用--bare克隆裸仓库 git clone git@gitee.com:xxx/testApp...

内存问题探微

这篇文章是我在公司 TechDay 上分享的内容的文字实录版,本来不想写这么一篇冗长的文章,因为有不少的同学问是否能写一篇相关的文字版,本来没有的也就有了。说起来这是我第二次在 TechDay 上做的分享,四年前第一届 TechDay 不知天高地厚,上去讲了一个《MySQL 最佳实践》,现在想起来那...

10款超牛Vim插件,爱不释手了

我是一个忠实的Vim编辑器用户,从事开发工作多年,我一直都非常喜欢使用Vim。轻量、便捷,而且,熟悉了Vim相关的快捷键之后,效率能够成倍的提升。除了这些之外,Vim像很多知名的IDE、编辑器一样,也支持插件配置,通过这些插件,可以实现更多高级、高效的操作。今天,就来给大家分享10个我特别喜欢的Vi...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...

三、Uni-app + vue3 页面如何跳转及传参?

Vue 项目往往需要使用 vue-router 插件,刚开始入门 Uni-app + Vue3 项目的同学,会不会想着路由使用 vue-router V4 版本不就可以了吗?不怕大家笑话,我就是这样想的,毕竟我是第一次使用 Uni-app ,由于孕期记性贼差,所以我决定写成笔记,加深记忆。uni-a...