Go程序性能分析方法(一文全解)

2023-11-02

前言

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 创建的一种性能分析图表,因为它的样子近似

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go程序性能分析方法(一文全解) 的相关文章

随机推荐

  • 深度神经网络加速库cuDNN简介

    深度神经网络加速库cuDNN简介 简介 NVIDIA CUDA深度神经网络库 cuDNN CUDA Deep Neural Network 是用于深度神经网络的 GPU 加速基元库 它提供了 DNN 应用程序中经常出现的例程的高度调整实现
  • JVM面试题

    JVM相关 jvm详解 GC 堆内存参数调优 春 的博客 CSDN博客 jvm堆内存调优 常见JVM面试题及答案整理 Java程序员 张凯的博客 CSDN博客 jvm面试题 JVM的模块 常见问题 JVM的理解 java8虚拟机和之前的变化
  • 表白代码,HTML

    1 在电脑桌面右击鼠标选择新建 文本文档 2 并命名为 biaobai txt 3 打开并且把一下代码复制并粘贴到biaobai txt
  • 【华为OD机试】TLV解析Ⅰ(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • coco数据集

    1 win10安装cocoapi pip install git https github com philferriere cocoapi git subdirectory PythonAPI win10安装cocoapi 君莫笑 CSD
  • [计算机毕业设计]MATLAB的人脸识别

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • BIT Python科学计算三维可视化(一)Tvtk库使用

    文章目录 一 课程来源 二 软件安装 三 Tvtk库使用 1 创建长方体数据源 2 Tvtk库中的其他数据源 3 Tvtk库中显示三维对象 4 Tvtk中的管线技术 1 可视化管线 2 图形管线 4 使用ivtk观察管线 5 Tvtk数据集
  • C++STL中set不存在对应元素时set.find的返回值

    先说结论 用find函数查找不存在的元素时 返回和 end 方法一样的迭代器 1 include
  • ArrayList的用法

    最近做个项目 需要用到ArrayList或List
  • 瑟瑟发抖吧~OpenAI刚刚推出王炸——引入ChatGPT插件,开启AI新生态

    5分钟学会使用ChatGPT 插件 ChatGPT plugins ChatGPT生态建设的开端 ChatGPT插件是什么 OpenAI最新官方blog资料表示 已经在ChatGPT中实现了对插件的初步支持 插件是专门为以安全为核心原则的语
  • Eigen源码阅读——杂文

    目录 README md signature of eigen3 matrix library eigen3 pc in pkg config配置文件 INSTALL CTestCustom cmake in CTest测试 COPYING
  • VS2015 经常卡顿的解决办法

    文章目录 方法1 关闭codelens 方法2 关闭视觉效果 方法3 改变并发编译数 方法4 源代码管理插件选 无 方法5 关闭 IntelliTrace 方法1 关闭codelens 工具 选项 搜索codelens 取消勾选 重启VS
  • 路由器虚拟服务器的设置

    在路由器 帐号和密码登录之后 路由器外网IP 虚拟服务器定义了广域网服务端口和局域网服务器之间的关系 所有对该广域网服务端口的访问都会被重定位给通过IP地址指定的局域网网络服务器 8888是80 你本机的端口 192 168 1 108 是
  • 堆的简单理解和代码实现

    目录 1 堆的概念及结构 1 1概念 1 2性质 2 堆的实现 2 1定义堆 2 2向下调整 2 3向上调整 2 3 2两种建堆方式时间复杂度的比较 2 4堆的初始化 2 5堆的销毁 2 6堆的插入操作 2 7堆的删除操作 2 8获取堆顶元
  • Python输出csv文件中文乱码及解决

    如图所示 python爬取信息后保存为csv格式 打开后中文乱码 原因是编码的缘故 CSV保存是编码格式ANSI 解决办法是以记事本方式打开CSV文件 然后另存为时编码选择UTF 8进行保存即可 失败了 换种方法 df to csv dat
  • unity 贴图设置

    把图片给物体时 由于比例不对 所以看起来不舒服 可以调节红色勾选的两个参数从而调好
  • IDEA下 tomcat&output输出乱码的解决方法

    在主界面选择help进入 选择 在编辑界面如下 添加以下代码 Dfile encoding UTF 8 保存退出即可 可以看到已经恢复正常了
  • OpenDrive格式地图数据解析

    OpenDrive地图解析代码可以参考 https github com liuyf5231 opendriveparser OpenDrive地图文件格式为xml 详细的介绍可以参考 http www opendrive org docs
  • 怎么配置mysql5.0_MySQL Server 5.0 – 安装及配置 超详细

    MySQL Server 5 0 安装及配置 关键字 MySQL 配置 环境 Window XP Professional SP2 MySQL Server 5 0 下载软件 MySQL Server 5 0 18 https dev my
  • Go程序性能分析方法(一文全解)

    文章目录 前言 采集方式 命令模式 调度图 监控方式 go torch方法 FlameGraph工具 wrk压测工具 go wrk go torch使用 Metricbeat 监控 自定义方法 前言 golang作为一门高效的语言 性能监控