Go程序性能分析方法(一文全解)
文章目录
- 前言
- 采集方式
- 命令模式
- 调度图
- 监控方式
- go-torch方法
- FlameGraph工具
- wrk压测工具(go-wrk)
- go-torch使用
- Metricbeat 监控
- 自定义方法
前言
golang作为一门高效的语言,性能监控和调试非常重要,如何进行性能监控和分析是优化的关键。
Go语言项目中的性能优化主要有以下几个方面:
- CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据
- Memory Profile(Heap Profile):报告程序的内存使用情况
- Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈
- Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的
go语言提供包
- runtime/pprof:采集工具型应用运行数据进行分析
- net/http/pprof:采集服务型应用运行时数据进行分析
采集方式
pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取格格函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。
引入包
import "runtime/pprof"
使用方法
pprof.StartCPUProfile(w io.Writer) //开启,向一个io中写入cpu信息
pprof.WriteHeapProfile(w io.Writer) //向一个io中写入内存信息
pprof.StopCPUProfile() //停止,写入完成
命令模式
将数据写入到文件中
通过 go tool pprof [文件名] 命令查看使用
我们可以在交互界面输入top3来查看程序中占用CPU前3位的函数:
其中:
- flat:当前函数占用CPU的耗时
- flat%:当前函数占用CPU的耗时百分比
- sun%:函数占用CPU的耗时累计百分比
- cum:当前函数加上调用当前函数的函数占用CPU的总耗时
- cum%:当前函数加上调用当前函数的函数占用CPU的总耗时百分比
- 最后一列:函数名称
也可以通过list 函数名查看函数的信息
通过分析发现大部分CPU资源被26行占用
调度图
输入web在网页中查看调度图,输入pdf生成一个pdf文件
需要安装工具graphviz
关于图形的说明: 每个框代表一个函数,理论上框的越大表示占用的CPU资源越多。 方框之间的线条代表函数之间的调用关系。 线条上的数字表示函数调用的次数。 方框中的第一行数字表示当前函数占用CPU的百分比,第二行数字表示当前函数累计占用CPU的百分比。
go tool pprof默认是使用-inuse_space进行统计,还可以使用-inuse-objects查看分配对象的数量。
监控方式
如果你的应用程序是一直运行的,比如 web 应用,那么可以使用net/http/pprof库,它能够在提供 HTTP 服务进行分析。
如果使用了默认的http.DefaultServeMux(通常是代码直接使用 http.ListenAndServe(“0.0.0.0:8000”, nil)),只需要在你的web server端代码中按如下方式导入net/http/pprof
import _ "net/http/pprof"
如果你使用自定义的 Mux,则需要手动注册一些路由规则:
r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)
如果你使用的是gin框架,那么推荐使用"github.com/DeanThompson/ginpprof"。
不管哪种方式,你的 HTTP 服务都会多出/debug/pprof endpoint,访问它会得到类似下面的内容:
这个路径下还有几个子页面:
- /debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
- /debug/pprof/heap: Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
- /debug/pprof/block:block Profiling 的路径
- /debug/pprof/goroutines:运行的 goroutines 列表,以及调用关系
go-torch方法
火焰图(Flame Graph)是 Bredan Gregg 创建的一种性能分析图表,因为它的样子近似
Go程序性能分析方法(一文全解)相关推荐
- 卷积为什么如此强大?一文全解深度学习中的卷积
卷积为什么如此强大?一文全解深度学习中的卷积 2018年05月10日 15:52:41 七月在线实验室 阅读数:17112 作者:Tim Dettmers(Understanding Convolut ...
- CSS3阴影实现方法及技巧全解
CSS3阴影实现方法及技巧全解 网页设计中常常要用到阴影的效果,通过阴影可以比较容易突出一个元素,在没有CSS3的时候,一般都用图片做阴影效果,而现在通过使用CSS3的text-shadow和box- ...
- 一文全解高级网格划分工具Fluent Meshing
作者 | 张杨 仿真秀专栏作者 ANSYS Fluent Meshing 是一款高级流体仿真前处理工具,具备从几何到求解的完整工作流程.其前身是Tgrid非结构体网格生成工具,并在最近的几个版本新增了 ...
- 【含泪提速!】一文全解相似度算法、跟踪算法在各个AI场景的应用(附代码)
大家好,我是cv君,大家是否为深度学习算法速度感到困扰?本次cv君倾力分享一个优秀的方法,通过相似度+跟踪方案优化速度问题,并提高了检测.分割算法稳定性,附带代码,一起肝起来吧~ 今天给大家全解一下图 ...
- 干货|一文全解深度学习中的卷积
来源:1024深度学习 概要:卷积现在可能是深度学习中最重要的概念.正是靠着卷积和卷积神经网络,深度学习才超越了几乎其他所有的机器学习手段. 译自Tim Dettmers的Understanding ...
- 点击部分刷新html ajax,一文全解web前端精简知识点
Web 前端知识体系精简介绍,让你学web前端轻松容易,让你选择web前端更轻松容易! Never give up on something you really want. It's difficu ...
- 02:一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)
标签(空格分隔): 王小草Tensorflow笔记 笔记整理者:王小草 笔记整理时间2017年2月24日 Tensorflow官方英文文档地址:https://www.tensorflow.org/g ...
- 抖音怎么在电脑上看_抖音电脑直播权限怎么开通?抖音直播伴侣怎么操作?一文全解...
我们都知道,在这个全民直播的时代,只需要一部手机就能随时随地开直播. 然而很多人在直播时都会遇到这样的问题: 手机直播画面不清晰:网速不给力,直播间人一多就卡出马赛克:手机硬件不够好,声音画面不同步. ...
- 技术博客丨原来模型训练可以不用标注?一文全解四大机器学习方法
作者:Ta-Ying Cheng,牛津大学博士研究生,Medium技术博主,多篇文章均被平台官方刊物Towards Data Science收录 即使在人工智能已经逐渐普遍的今天,有许多人对机器学习相 ...
最新文章
- 『Python基础-11』集合 (set)
- Unigui 服务器解析php,如何正确使用uniGUI的HyperServer(负载均衡)功能
- Git使用方法——原创
- python—多线程之共享数据
- python 命名管道_Python:检查命名管道是否有数据
- CodeIgniter模型
- java学习(78):GUL拆分窗口
- mybatis3 oracle,Mybatis3中對oracle的批量插入
- 网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array...
- 利用NABCD模型进行竞争性需求分析
- Mysql中的日期及时间相关函数
- 099 元类( 控制对象产生和控制类产生)模板
- 郑中基 英雄寞 08版射雕英雄传片头曲 LRC歌词
- Word 远程调用失败:异常来自 HRESULT:0x800706BE
- 推荐一款微信小程序《诗词万卷》
- Windows常见的几种权限维持
- 物理综合 | congestion 报告解读
- QDialog无边框
- 7月,带你阅读图灵原创图书以及上榜新书
- 求大神解答!!!!在线死等!