文章目录

  • 1. 安装graphviz
    • 1.1 下载 graphviz (windows 环境)
    • 1.2 测试graphviz是否安装成功
  • 2. 使用pprof
    • 2.1 修改代码
    • 2.2 火焰图生成
  • 3. Gin框架使用pprof
    • 3.1 安装需要包
    • 3.2 启动程序
    • 3.3 火焰图
    • 3.4 pprof命令行
    • 参考文档

1. 安装graphviz

1.1 下载 graphviz (windows 环境)

https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

下载完之后安装,安装完成之后将graphviz的安装bin目录加入环境变量中

# 例如
C:\Program Files (x86)\Graphviz2.38\bin

1.2 测试graphviz是否安装成功

dot -version
dot - graphviz version 2.38.0 (20140413.2041)
libdir = "C:\Program Files (x86)\Graphviz2.38\bin"
Activated plugin library: gvplugin_dot_layout.dll
Using layout: dot:dot_layout
Activated plugin library: gvplugin_core.dll
Using render: dot:core
Using device: dot:dot:core
The plugin configuration file:C:\Program Files (x86)\Graphviz2.38\bin\config6was successfully loaded.render      :  cairo dot fig gd gdiplus map pic pov ps svg tk vml vrml xdotlayout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopitextlayout  :  textlayoutdevice      :  bmp canon cmap cmapx cmapx_np dot emf emfplus eps fig gd gd2 gif gv imap imap_np ismap jpe jpeg jpg metafile pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vml vmlz vrml wbmp xdot xdot1.2 xdot1.4loadimage   :  (lib) bmp eps gd gd2 gif jpe jpeg jpg png ps svg

2. 使用pprof

2.1 修改代码

main.go

import "net/http"
import _ "net/http/pprof"
func main() {http.ListenAndServe("0.0.0.0:8080", nil)
}

启动程序

go run main.go

# 通过浏览器访问
http://127.0.0.1:8080/debug/pprof/
# 访问该地址将看到性能分析界面

2.2 火焰图生成

在命令行下执行

go tool pprof -http=:1234 http://localhost:8080/debug/pprof/profile
# 执行上述命令稍微等会,浏览器上会出现一UI界面
VIEW->Flame Graph
看到火焰图

3. Gin框架使用pprof

3.1 安装需要包

进入项目根目录,安装gin使用的pprof包

 go get github.com/gin-contrib/pprof

在项目中使用pprof
example:

package mainimport ("github.com/gin-contrib/pprof""github.com/gin-gonic/gin"
)func main() {router := gin.Default()pprof.Register(router)router.Run(":8080")
}

3.2 启动程序

启动程序之后会看到很多自动添加pprof 相关的接口

通过这些接口我们可以进行分析

go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:   export GIN_MODE=release- using code:  gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /debug/pprof/             --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/cmdline      --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/profile      --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] POST   /debug/pprof/symbol       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/symbol       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/trace        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/allocs       --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/block        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/goroutine    --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/heap         --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/mutex        --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)
[GIN-debug] GET    /debug/pprof/threadcreate --> github.com/gin-contrib/pprof.pprofHandler.func1 (3 handlers)...
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

通过浏览器访问

http://127.0.0.1:8080/debug/pprof/

allocs :过去所有内存分配的抽样
block :导致在同步基元上阻塞的堆栈跟踪
cmdline :当前程序的命令行调用
goroutine :goroutine堆栈跟踪
heap :活动对象的内存分配的采样
mutex :争用互斥锁的持有者的堆栈跟踪
profile :CPU摘要信息。您可以在seconds GET参数中指定持续时间。获得概要文件之后,使用go工具pprof命令来调查该概要文件。
threadcreate : 操作系统线程堆栈跟踪
trace : 当前程序的执行轨迹。您可以在seconds GET参数中指定持续时间。获得跟踪文件后,使用go工具跟踪命令来调查跟踪。

3.3 火焰图

在新的命令行窗口

# 执行命令后,会在浏览器打开一个窗口
go tool pprof -http=:1234 http://localhost:8080/debug/pprof/goroutine# 简单解释
# -http 表示使用交互式web接口查看获取的性能信息,指定可用的端口即可
# debug/pprof/需要查看的指标 (allocs,block,goroutine,heap...)

在浏览器中能看到如下的性能分析图:

火焰图:

3.4 pprof命令行

在命令行下可以看到性能数据

使用 go tool pprof + 数据源

example :

go tool pprof http://127.0.0.1:8080/debug/pprof/allocs

命令行下执行 ,常用的命令有top,tree,web等,通过help命令查看更多

PS G:\> go tool pprof http://127.0.0.1:8080/debug/pprof/allocs
Fetching profile over HTTP from http://127.0.0.1:8080/debug/pprof/allocs
Saved profile in C:\Users\captain\pprof\pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz
Type: alloc_space
Time: Sep 19, 2020 at 3:53pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
# help 命令可以查看所有命令
# top [n] 查看性能指标数据
(pprof) top 5
Showing nodes accounting for 1026.66kB, 100% of 1026.66kB total
Showing top 5 nodes out of 11flat  flat%   sum%        cum   cum%514.63kB 50.13% 50.13%   514.63kB 50.13%  math/rand.NewSource512.03kB 49.87%   100%   512.03kB 49.87%  regexp/syntax.(*parser).maybeConcat0     0%   100%   512.03kB 49.87%  github.com/jinzhu/gorm.init.ializers0     0%   100%   514.63kB 50.13%  math/rand.init.ializers0     0%   100%   512.03kB 49.87%  regexp.Compile
# tree [n] 以树形显示指标数据
(pprof) tree 5
Showing nodes accounting for 1026.66kB, 100% of 1026.66kB total
Showing top 5 nodes out of 11
----------------------------------------------------------+-------------flat  flat%   sum%        cum   cum%   calls calls% + context
----------------------------------------------------------+-------------514.63kB   100% |   math/rand.init.ializers514.63kB 50.13% 50.13%   514.63kB 50.13%                | math/rand.NewSource
----------------------------------------------------------+-------------512.03kB   100% |   regexp.Compile512.03kB 49.87%   100%   512.03kB 49.87%                | regexp/syntax.(*parser).maybeConcat
----------------------------------------------------------+-------------0     0%   100%   512.03kB 49.87%                | github.com/jinzhu/gorm.init.ializers512.03kB   100% |   regexp.Compile
----------------------------------------------------------+-------------0     0%   100%   514.63kB 50.13%                | math/rand.init.ializers514.63kB   100% |   math/rand.NewSource
----------------------------------------------------------+-------------512.03kB   100% |   github.com/jinzhu/gorm.init.ializers0     0%   100%   512.03kB 49.87%                | regexp.Compile512.03kB   100% |   regexp/syntax.(*parser).maybeConcat
----------------------------------------------------------+-------------      # web命令是希望通过web形式(在浏览器器中看到),因为前面已经安装了graphviz,所以web可以使用
# web命令会直接打开浏览器
(pprof) web

参考文档

- [1] gin-contrib/pprof
- [2] pprof

Golang pprof 性能分析与火焰图相关推荐

  1. CentOS 7 Linux实时内核下的epoll性能分析后续 | 火焰图分析

    在<CentOS 7 Linux实时内核下的epoll性能分析>从源码角度分析了epoll在实时内核和非实时内核之间的差异,为了更好的展示问题所在,这里给出epoll和select在实时内 ...

  2. mysql火焰图_Linux 性能分析利器 -火焰图 flame graph

    简述 Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack). 通常,它的执行频率是 99Hz(每秒99次), ...

  3. 【Linux性能分析】火焰图(Flame Graphs)的安装和基本用法

    转载:火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析 ...

  4. go pprof 性能分析

    Go 的运行时性能分析接口都位于 runtime/pprof 包中.只需要调用 runtime/pprof 库即可得到我们想要的数据. CPU 性能分析 编写代码,生成分析报告 假设我们实现了这么一个 ...

  5. Go pprof 性能分析工具 - 详细使用图解

    一.Go导入pprof包的选择及go版本要求: 如果你是使用 net/http 包来构建web服务(有启动http服务),想查看服务运行的相关状态,就可以使用 net/http/pprof 包,导入方 ...

  6. Linux性能分析工具与图形化方法

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:赵坤|腾讯魔王工作室后台开发工程师 在项目开发中,经常会遇到程序启动时间过长.CPU使用率过高等问题,这个时候需要依靠性能分析工具来 ...

  7. C++ Perf性能调优+火焰图调优

    系列服务器开发 文章目录 系列服务器开发 前言 一.PERF是什么 二.火焰图是什么 二.c++代码优化过程 总结 前言 系统级性能优化通常包括两个阶段:性能剖析(performance profil ...

  8. 【性能】perf + 火焰图分析软件性能瓶颈

    目录 零.即看即用 一.perf 命令 perf简介 perf record参数 命令例子 二.火焰图的含义 三.互动性 四.火焰图示例 五.局限 六.Node 应用的火焰图 七.浏览器的火焰图 八. ...

  9. 性能优化必备——火焰图

    引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点. 结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈. 背景 当前现状 假设没有 ...

最新文章

  1. PHP框架之间有什么区别,php框架和设计模式区别
  2. 安装sqoop1.4.6-cdh5.5.2
  3. 〖Python〗-- 性能相关及深度优先与广度优先
  4. 解决VMware虚拟机安装的ubuntu显示屏幕小的问题
  5. 组件对象模型:COM
  6. 201904快速阅读术
  7. 单列多行转单行单列合并oracle_oracle中多行转单行的两种方法
  8. Single sign-on,什么是单点登陆?
  9. Robot Freamwork 安装配置文档
  10. T-SQL行合并成列与列拆分成行
  11. 硬石类山水盆景的制造技法
  12. 中文代码示例视频演示Python入门教程第五章 数据结构
  13. tablewidget
  14. 视频剪辑一定要知道这6个免费视频素材库
  15. java面试看这一篇就够了
  16. 大数据告诉你,其实中国电影票房的最强锦鲤,不是吴京
  17. 基于JavaWeb+MySQL的简历信息管理系统
  18. DLink_RCE_CVE-2019-17621浅析
  19. 鸿蒙系统微信怎么操作,鸿蒙系统无微信?为何腾讯如此恶心
  20. 如何制作伪原创视频短视频伪原创软件

热门文章

  1. windows7 x64系统安装VC++6.0的方法探讨
  2. 【Java Web】Day 3 JDBC
  3. TypeScript零基础入门之背景介绍和环境安装
  4. java 对象 数据库中_Java将对象直接在数据库中存取的方法
  5. 基于深度强化学习的智能车间调度方法研究
  6. C# winform点击某个窗口报错--调用目标发生异常
  7. Pandas loc与iloc
  8. 人工耳蜗做完以后有没有副作用
  9. 微信小程序学习 (一)
  10. mysql 新建database_MySQL创建数据库(CREATE DATABASE语句)