golang性能分析,pprof的使用,graphviz,火焰图

2023-11-10

golang中的pprof的使用,graphviz

一、关于pprof包

go中有pprof包来做代码的性能监控,包括 cpu profile, mem profile, block profile,在两个地方有包:

net/http/pprof
runtime/pprof

其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。二者的区别在于:
1、runtime/pprof:调用了就开始采样了,数据会不断被写入文件。
2、net/http/pprof:只有在调用了某个API的时候,才会发起采样,并sleep一段时间,时间到了就会关闭采样,所以日志文件是按需写入的。

二、使用

方法1、WEB服务器

如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。

方法2、常驻进程

如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包_ "net/http/pprof",然后在开启另外一个goroutine来开启端口监听。

比如:

go func() {
        log.Println(http.ListenAndServe(":6060", nil)) 
}()

无论是常驻进程,还是WEb服务器场景,pprof 包都会注册如下路由

func init() {
	http.HandleFunc("/debug/pprof/", Index)
	http.HandleFunc("/debug/pprof/cmdline", Cmdline)
	http.HandleFunc("/debug/pprof/profile", Profile)
	http.HandleFunc("/debug/pprof/symbol", Symbol)
	http.HandleFunc("/debug/pprof/trace", Trace)
}

如果是WEB服务器,我们可以选择监听新的端口,或者使用原有监听;但是如果使用原有监听的话可能无法注册路由,比如你使用的是GIN框架,这个时候可以使用方法2来实现;当然,GIN也有方式来以方法1来开启pprof,这个后面再讲。

访问地址:http://localhost:6060/debug/pprof/,或者 http://localhost:6060/debug/pprof?seconds=30
在这里插入图片描述

点击每一项可以看到一些原始数据。

由源码可知,基于 http 的 pprof 是在你请求 profile 的时候,它会临时采集一个时间区间(比如30秒)内的对应性能数据;而访问其他指标会立即返回。再采集的时候需要来个压测,这样才会有数据。

这是一种非侵入式的指标采集,几乎不会影响服务的性能。

方法3、普通程序

如果你的go程序只是一个应用程序,比如计算fabonacci数列,由于程序的执行时间不确定,所以就不好使用net/http/pprof包了,最好使用到runtime/pprof来手动开启采样。具体做法就是用到pprof.StartCPUProfilepprof.StopCPUProfile。比如下面的例子:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }

运行程序的时候加一个--cpuprofile参数,比如./fabonacci --cpuprofile=fabonacci.prof

这样程序运行的时候的cpu信息就会记录到fabonacci.prof中了。记录的是从 pprof.StartCPUProfilepprof.StopCPUProfile这期间的CPU的累积使用情况。

由源码可知,当调用了pprof.StartCPUProfile,就开始以每秒100次(也就是每10毫秒一次)的频率对CPU的使用情况进行采样,而pprof.StopCPUProfile就是将采样频率设置为0且停止采样,然后等待将采样数据写入文件的过程执行完毕,因此必须要保证pprof.StopCPUProfile被正常执行完毕,否则可能日志文件没有内容或者内容错误。

查看内存泄漏或消耗分析,可以使用

fm, err := os.OpenFile("./tmp/mem.out", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
    log.Fatal(err)
}
pprof.WriteHeapProfile(fm)
fm.Close()

三、go tool pprof 与 图形化

通过 pprof 得到的信息都是原始数据,阅读起来很费劲,我们可以通过 go tool pprof命令来辅助查看以及图形化的方式来展示。

下载安装 graphviz :https://graphviz.org/download/

https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/2.47.3/stable_windows_10_cmake_Release_x64_graphviz-install-2.47.3-win64.exe

并且添加到环境变量。

否则会报错:

failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH%

示例:pp.gp

package main

import (
	"log"
	"net/http"
	"fmt"
	_ "net/http/pprof"
)

func myHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World!\n")
}

func main() {
	http.HandleFunc("/hello", myHandler)
	log.Fatal(http.ListenAndServe(":6060", nil))
}

以查看CPU性能为例,先启动压测

go-wrk -c=400 -t=8 -n=100000 http://localhost:6060/hello

再输入命令

go tool pprof http://localhost:6060/debug/pprof/profile

于是进入一个交互界面
在这里插入图片描述

最后一列为函数名称,其他各项内容意义如下:

flat: 当前函数占用CPU的时间
flat%: 当前函数占用CPU百分比
sum%: 当前所有函数累加使用 CPU 的比例
cum: 当前函数以及子函数占用CPU的时间
cum%:  当前函数以及子函数占用CPU的百分比

由提示可知,它是先将下载的原始数据保存在临时文件,然后再来分析。

常用的两个命令

top 10 列出前10
web   调用 graphviz 生成svg图片,然后打开
list  查看具体的函数分析
pdf   命令可以生成可视化的pdf文件
help  命令可以提供所有pprof支持的命令说明

当输入 web 后,会生成svg文件,会打开浏览器。
在这里插入图片描述
方框里面有百分比,同时方框越大占的CPU时间越多。当然,这样太难分析了,还有更直观的方式。

输入

go tool pprof http://localhost:6060/debug/pprof/profile

Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile
Saved profile in C:\Users\Administrator.DESKTOP-TPJL4TC\pprof\pprof.samples.cpu.001.pb.gz
Type: cpu
Time: Jul 14, 2021 at 10:53am (CST)
Duration: 30s, Total samples = 23.51s (78.36%)
Entering interactive mode (type "help" for commands, "o" for options)

退出命令行,复制Saved profile后面的文件名

go tool pprof -http localhost:3001 C:\Users\Administrator.DESKTOP-TPJL4TC\pprof\pprof.samples.cpu.001.pb.gz

这样就是在浏览器中打开了。

默认是以 greph 的方法展示,首页和上面的图形一样。

可以切换到火焰图 Flame Graph
在这里插入图片描述
每个方块代表一个函数,它下面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。

另外,有时候我们通过其他途径得到了 pprof 文件,也可以通过它来分析

使用go tool pprof 应用程序 应用程序的prof文件 或者 go tool pprof prof文件
在这里插入图片描述
go tool pprof 教程:https://github.com/hyper0x/go_command_tutorial/blob/master/0.12.md

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

golang性能分析,pprof的使用,graphviz,火焰图 的相关文章

  • go struct{} 空结构体的特点和作用

    空结构体的特点和作用 参考代码 package main import fmt unsafe func main empStruct 空结构体的实例和作用 func empStruct 空结构体的特点 1 不占用内存 2 地址不变 var
  • go踩坑——no required module provides package go.mod file not found in current directory or any parent

    背景 准备运行下面代码 package main import github com gin gonic gin func main 创建一个默认的路由引擎 r gin Default GET 请求方式 hello 请求的路径 当客户端以G
  • golang之跨语言ipc通信

    1 golang之跨语言ipc通信 文章目录 1 golang之跨语言ipc通信 1 1 unix domain Socket unix域套接字 介绍 1 2 IPC SOCKET通信 1 2 1 函数及地址定义介绍 1 2 2 UNIX
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • Golang适合高并发场景的原因分析

    典型的两个现实案例 我们先看两个用Go做消息推送的案例实际处理能力 360消息推送的数据 16台机器 标配 24个硬件线程 64GB内存 Linux Kernel 2 6 32 x86 64 单机80万并发连接 load 0 2 0 4 C
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • Go_关键字、编译、转义字符

    关键字 关键字是指被go语言赋予了特殊含义的单词 共25个 关键字不能用于自定义名字 只能在特定语法结构中使用 break default func interface select case defer go map struct cha
  • Jenkins系列:3、wsl/ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序

    Jenkins系列 3 wsl ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序 文章目录 Jenkins系列 3 wsl ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序 1 前言 2 wsl
  • Go语言里面的各种疑难杂症

    什么是闭包 闭包有什么缺陷 func AddUpper func int int var n int 10 return func x int int n n x return n func main f AddUpper fmt Prin
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • 【go语言开发】loglus日志框架的使用

    本文将简单介绍loglus框架的基本使用 并给出demo 文章目录 前言 Loglus常见用法 自定义日志级别 使用字段钩子 输出到多个位置 使用钩子实现自定义日志处理 demo
  • go-zero 开发入门-加法客服端示例

    定义 RPC 接口文件 接口文件 add proto 的内容如下 syntax proto3 package add 当 protoc gen go 版本大于 1 4 0 时需加上 go package 否则编译报错 unable to d
  • go-zero开发入门-API服务开发示例

    接口定义 定义 API 接口文件 接口文件 add api 的内容如下 syntax v1 info title API 接口文件示例 desc 演示如何编写 API 接口文件 author 一见 date 2023年12月07日 vers
  • go-zero开发入门-API网关鉴权开发示例

    本文是 go zero开发入门 API网关开发示例 一文的延伸 继续之前请先阅读此文 在项目根目录下创建子目录 middleware 在此目录下创建文件 auth go 内容如下 鉴权中间件 package middleware impor
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • go开发--操作mysql数据库

    在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动 Go 中常用的 MySQL 驱动有 github com go sql driver mysql 和 github com go xorm xorm
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML

随机推荐

  • Eclipse语言包下载

    Eclipse语言包下载
  • PAT 甲级(Python) #1033 To Fill or Not to Fill (25 分)贪心算法和分治法的python实现

    1033 To Fill or Not to Fill 25 分 KY155 To Fill or Not to Fill 分治法求解 不完善 include
  • Convolutional Pose Machine总结

    Convolutional Pose Machine总结 目录 文章目录 目录 Convolutional Pose Machine简介 算法详细分析 算法流程 训练阶段 使用阶段 创新点 数据集 效果展示 参考资料 博客 github C
  • Centos7 安装vm tools 工具 (命令行版本)

    一 准备工作 1 菜单栏安装VMware Tools 点击VMware菜单栏 虚拟机 选择 安装VMware Tools 如果安装了早期版本的VMware Tools 则菜单项为 更新VMware Tools 2 装载CD ROM 查看 虚
  • CentOS 安装redis及nginx报错:./configure: error: can not define uint32_t(yum及gcc都已安装)

    错误截图如下 解决方案如下 安装kernel headers yum install kernel headers kernel devel gcc make y
  • Git仓库代码迁移

    Git仓库代码迁移 前言 本文建立在已有 git 仓库地址存在的情况下 将当前 gitLab 仓库的代码迁移到另一个 gitLab 仓库中 或有其他更加简洁的方案 由于时间仓促 并未过多研究 还望大佬指点 以下操作如有不当 望指正 步骤 新
  • XGBoost股票预测

    XGBoost 极端梯度提升 Extreme Gradient Boosting XGBoost 有时候也直接叫做XGB 和GBDT类似 也会定义一个损失函数 不同于GBDT的是只会用到一阶导数信息 XGBoost会利用泰勒展开式把损失函数
  • React实现购物车基本功能(React-redux)

    本案例利用react redux实现购物车功能 概括有以下步骤 1 利用react redux操作商品的选中状态 2 全选与取消全选 3 动态reduce计算价格 4 结算取出商品id 演示网址 https zhangyongwnag gi
  • 连接失败_macOS下蓝牙键盘(Keychron K2)连接失败的解决办法

    笔者前段时间被各大科技博主种草购买了一个蓝牙键盘 Keychron K2 但使用经历并非一帆风顺 问题描述 问题1 笔者使用的系统是macOS Mojave 10 14 6 在我初次连接键盘的时候我就发现了一丝丝的不对劲 我按照说明 打开了
  • 1059 C语言竞赛(PAT 乙级 C++实现)

    1059 C语言竞赛 20 point s C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛 既然竞赛主旨是为了好玩 颁奖规则也就制定得很滑稽 0 冠军将赢得一份 神秘大奖 比如很巨大的一本学生研究论文集 1 排名为素数的学生将赢得最好
  • 区块链运作机制_区块链如何运作? 铂 2

    区块链运作机制 This article was originally published on Blockchain Review Thank you for supporting the partners who make SitePo
  • AndroidStudio导入项目作为library

    在项目根目录下建立一个 libraries文件夹 移动你要使用的library project到libraries 目录 为什么 是移动 本人试过复制到工程 但复制过来的库工程里面的src目录下的代码会丢失 注意 你的library pro
  • Android开机启动流程简析

    Android开机启动流程简析 一 文章目录 Android开机启动流程简析 一 前言 一 开机启动的流程概述 二 Android的启动过程分析 1 总体流程 init简述 Zygote简述 前言 在学习Android过程中开机启动是必要了
  • 批量下载百度搜索图片+labelimg制作自己的数据集+转换至Yolo-v5训练数据集

    由于课题需要 需要自己制作数据集进行训练 目前是自己制作的第二个数据集 发现有某些细节已经忘记 记录备忘 同时为后来者提供借鉴 文章以car tank数据集做为例子介绍 整体流程 1 准备数据 从各种途径获取原始数据 博主的car tank
  • 高德地图报错TypeError: undefined is not a constructor

    高德地图在开发聚合和路线规划时报错TypeError undefined is not a constructor evaluating new n Driving map pe found in 经排查 原因是没有引入对应的插件 我们来看
  • IntelliJ IDEA流行的构建工具——Gradle

    IntelliJ IDEA 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 尤其在智能代码助手 代码自动提示 重构 JavaEE支持 各类版本工具 git svn等 JUnit CVS整合 代码分析
  • 猿如意 Chatgpt的使用规则

    猿如意 Chatgpt 是一种自然语言生成模型 它可以用来自动生成文本内容 使用规则如下 启动猿如意 Chatgpt 模型 输入自然语言文本作为模型的输入 根据模型的输出生成文本内容 可以根据需要修改输入文本或调整模型的参数来得到不同的输出
  • pandas逐行/列 遍历Dataframe的三种方式

    目录 一 pandas DataFrame iterrows 二 pandas DataFrame itertuples 三 pandas DataFrame items pandas 逐行 逐列 遍历数据有以下三种方法 一 pandas
  • Qt学习总结(一)

    一 项目中遇到的问题 1 c 文件中不同类如何共用一个变量 头文件1 h 源文件1 cpp 其他源文件2 cpp 3 cpp这些源文件都包含头文件1 h 方法 在1 h声明全局变量 extern int n 在1 cpp定义该全局变量 in
  • golang性能分析,pprof的使用,graphviz,火焰图

    golang中的pprof的使用 graphviz 一 关于pprof包 go中有pprof包来做代码的性能监控 包括 cpu profile mem profile block profile 在两个地方有包 net http pprof