golang入门笔记——pprof性能分析

文章目录

  • 简介
  • runtime/pprof的使用
  • 命令行交互
  • 网络服务性能分析
  • pprof与性能测试结合
  • 压测工具go-wrk

简介

golang性能分析工具pprof的8个指标

1.性能分析的5个方面:CPU、内存、I/O、goroutine(协程使用情况和泄漏检查)、死锁检测以及数据竟态分析

	runtime.SetMutexProfileFraction(1) //开启对锁调用的跟踪 mutexruntime.SetBlockProfileRate(1)     //开启对阻塞操作的跟踪

2.两种程序性能指标采集

runtime/pprof:采集工具型应用运行数据进行分析
net/http/pprof:采集服务型应用运行时数据进行分析

pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取各个函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。

3.交互式终端性能分析

不管是工具型应用还是服务型应用,我们使用相应的pprof库获取数据之后,下一步的都要对这些数据进行分析,我们可以使用go tool pprof命令行工具。

go tool pprof [binary] [source]
#binary是应用的二进制文件,用来解析各种符号
#source标识profile数据的来源,可以是本地的文件,也可以是http地址

4.web网页性能分析

如果你的应用程序是一直运行的,比如 web 应用,那么可以使用net/http/pprof库,它能够在提供   HTTP 服务进行分
析。
如果使用了默认的http.DefaultServeMux(通常是代码直接使用 http.ListenAndServe(“0.0.0.0:8000”,  nil)),只需要
在你的web server端代码中按如下方式导入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/gin-contrib/pprof,在代码中通过以下命令注册pprof相关路由。

pprof.Register(router)

访问地址:http://host:port/debug/pprof会出现性能分析的网页

这个路径下还有几个子页面:

/debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
/debug/pprof/heap: Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
/debug/pprof/block:block Profiling 的路径
/debug/pprof/goroutines:运行的 goroutines 列表,以及调用关系

runtime/pprof的使用

代码:

package mainimport ("flag""fmt""os""runtime/pprof""time"
)func logicCode() {var c chan intfor {select {case v := <-c:fmt.Printf("recv from chan, value:%v\n", v)default:}}
}func main() {var isCPUPprof boolvar isMemPprof boolflag.BoolVar(&isCPUPprof, "cpu", false, "turn cpu pprof on")flag.BoolVar(&isMemPprof, "mem", false, "turn mem pprof on")flag.Parse()if isCPUPprof {file, err := os.Create("./cpu.pprof")if err != nil {fmt.Println("create cpu pprof failed,err:", err)return}pprof.StartCPUProfile(file) defer file.Close()defer pprof.StopCPUProfile()}for i := 0; i < 8; i++ {go logicCode()}time.Sleep(20 * time.Second)if isMemPprof {file, err := os.Create("./mem.pprof")if err != nil {fmt.Println("create mem pprof failed,err:", err)return}pprof.WriteHeapProfile(file)file.Close()}
}

命令行交互

使用go工具链里的pprof来进行分析

go tool pprof cpu.pprof
#go tool pprof http://127.0.0.1:8000/debug/pprof/profile

在这里插入图片描述

topN来获取占用CPU前几位的函数:

top3 #获取占用CPU前3位的函数

在这里插入图片描述
flat:当前函数占用CPU的耗时
flat%:当前函数占用CPU耗时占总CPU耗时的百分比
sum%:函数占用CPU的耗时累计百分比
cum:当前函数加上当前函数调用函数占用CPU的总耗时
cum %:当前函数加上当前函数调用函数占用CPU总耗时百分比
最后一列:函数的名称

list 函数名,查看具体的函数分析

list logicCode

在这里插入图片描述
可以看出函数的所有耗时都在 case v:=<-c这条语句的执行中。

网络服务性能分析

package mainimport ("fmt""net/http"_ "net/http/pprof""strings"
)func main() {http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {r.ParseForm()fmt.Println(r.Form)fmt.Println("path:", r.URL.Path)fmt.Println("scheme:", r.URL.Scheme)for k, v := range r.Form {fmt.Println("key:", k)fmt.Println("val:", strings.Join(v, ""))}w.Write([]byte("hello world"))})http.ListenAndServe("127.0.0.1:8080", nil)
}

第一种方式:

#分析5s内对应服务的性能
go tool pprof -seconds=5 http://127.0.0.1:8080/debug/pprof/profile 
#go tool pprof -seconds=5 http://127.0.0.1:8080/debug/pprof/heap

第二种方式:

下载原始数据文件到XXX-X.out目录,对于一些需要累计到一些时间才能采集的指标,我们可以使用?seconds=X来设置
curl -o XXX-X.out http://127.0.0.1:8080/debug/pprof/XXX?seconds=X

#获取10s内内存的使用情况
curl -o profile.out http://127.0.0.1:8080/debug/pprof/heap?seconds=10
go tool pprof profile.out

在这里插入图片描述

对gin服务进行性能分析

package mainimport ("fmt""github.com/gin-contrib/pprof""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/hello", func(c *gin.Context) {var ch chan intselect {case v := <-ch:fmt.Println(v)default:}})pprof.Register(r)r.Run()
}

访问网址:http://localhost:8080/debug/pprof
在这里插入图片描述
3 allocs:表示过去进行过3次内存分配
0 block:表示0个阻塞
0 cmdline:执行的命令行
4 goroutine:创建的goroutine数量
3 heap:3个活动中的对象内存分配情况
0 mutex:当前锁竞争的数量
0 profile:cpu使用情况进行采用,默认采样30s,后面加参数seconds=60来指定时间
5 threadcreate:线程的创建数
0 trace:整个程序的运行过程的跟踪

pprof与性能测试结合

go test命令有两个参数和pprof相关,它们分别指定生成的CPU和Memory profiling保存的文件

-cpuprofile: cpu profiling数据要保存的文件地址
-memprofile:memory profiling数据要保存的文件地址
go test -bench . -cpuprofile=cpu.profgo test -bench . -memprofile=./mem.profgo test -bench . -blockprofile=./block.prof

压测工具go-wrk

go-wrk的包的下载

go get github.com/adeven/go-wrk

go-wrk的使用格式

go-wrk [flags] url

常用参数:

-H="User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;":'\n'分隔的请求头
-c=100: 使用的最大连接数
-k=true: 是否禁用keep-alives
-i=false: if TLS security checks are disabled
-m="GET": HTTP请求方法
-n=1000: 请求总数
-t=1: 使用的线程数
-b="" HTTP请求体
-s="" 如果指定,它将计算响应中包含搜索到的字符串s的频率
go-wrk -t=8 -c=100 -n=10000 "http://127.0.0.1:8080/api/v1/posts?size=10"

输出结果


==========================BENCHMARK==========================
URL:                            http://127.0.0.1:8080/api/v1/posts?size=10Used Connections:               100
Used Threads:                   8
Total number of calls:          10000===========================TIMINGS===========================
Total time passed:              2.74s
Avg time per request:           27.11ms
Requests per second:            3644.53
Median time per request:        26.88ms
99th percentile time:           39.16ms
Slowest time for request:       45.00ms=============================DATA=============================
Total response body sizes:              340000
Avg response body per request:          34.00 Byte
Transfer rate per second:               123914.11 Byte/s (0.12 MByte/s)
==========================RESPONSES==========================
20X Responses:          10000   (100.00%)
30X Responses:          0       (0.00%)
40X Responses:          0       (0.00%)
50X Responses:          0       (0.00%)
Errors:                 0       (0.00%)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138492.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETHERCAT转MODBUS TCP/IP协议网关

产品介绍 JM-ECT-TCPIP是自主研发的一款EtherCAT从站功能的通讯网关。该产品主要功能是将EtherCAT网络和 TCP/IP 网络连接起来。 本网关连接到EtherCAT总线中做为从站使用&#xff0c;连接到 TCP/IP 网络中做为服务器或客户端使用。 产品参数 技术参数 u 网关做为EtherCAT网…

淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日&#xff0c;淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA&#xff0c;旨在让技术开发者们能够更方便地提升大语言模型训练性能&#xff0c;降低训练成本&#xff0c;并保持和LLaMA社区的兼容性。测试显示&#xff0c;在32卡训练上&#xff0c;相…

八、数据类型转换

数据类型转换 1.数据类型转换1.1.隐式类型转换1.2.显式类型转换1.3.训练11.4.训练2 —————————————————————————————————————————————————— 1.数据类型转换 类型转换是将一个值从一种类型更改为另一种类型的过程。例如&…

Haproxy负载均衡群集

HAproxy搭建Web群集一、Web集群调度器1、常见的Web集群调度器2、常用集群调度器的优缺点&#xff08;LVS ,Nginx,Haproxy)2.1 Nginx2.2 LVS2.3 Haproxy 3、LVS、Nginx、HAproxy的区别 二、Haproxy1、简介2、Haproxy应用分析3、HAProxy的主要特性4、Haproxy调度算法&#xff08;…

有了Spring为什么还需要SpringBoot呢

目录 一、Spring缺点分析 二、什么是Spring Boot 三、Spring Boot的核心功能 3.1 起步依赖 3.2 自动装配 一、Spring缺点分析 1. 配置文件和依赖太多了&#xff01;&#xff01;&#xff01; spring是一个非常优秀的轻量级框架&#xff0c;以IOC&#xff08;控制反转&…

命令提示符cmd查询IP地址ipconfig, linux 系统中查看ip地址ifconfig

1.windowR 2.输入cmd----》确定 3.在命令行中输入ipconfig然后按回车。IPv4地址就是电脑的IP地址。 linux系统中查看ip地址 &#xff1a; ifconfig

vue内置组件Transition的详解

1. Transition定义 Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition>会在一个元素或组件进入和离开 DOM 时应用动画。 <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入&#xff0c;移动&#xff0…

使用企业订货系统的原因和考虑|网上APP订单管理软件

使用企业订货系统的原因和考虑|网上APP订单管理软件 企业要用订货系统主要如下原因&#xff1a; 第一、在线订货系统能让销售即时看到商品信息。商品售价多少&#xff0c;进货价多少&#xff0c;上次跟客户的成交价是多少&#xff0c;最低可以卖多少钱&#xff0c;用个本子记录…

计算机操作系统 (王道考研)笔记(二)

重点知识点 1 内存1.1 内存的基础知识1.1.1 内存定义、作用1.1.2 指令的工作原理1.1.3 三种装入策略1.1.4 从写程序到程序运行1.1.5 链接的三种方式1.1.6 总结 1.2 内存管理1.2.1 内存空间的分配与回收a&#xff09; 连续分配管理b&#xff09; 非连续分配管理1&#xff09; 基…

线性代数的本质(六)——线性空间

文章目录 线性空间线性空间子空间坐标与同构线性变换与矩阵基变换与坐标变换 线性空间 线性空间 Grant: 普适的代价是抽象。 仔细分析就会发现&#xff0c;关于向量空间的一切概念及有关定理都不依赖于向量的具体表现形式(有序数组)&#xff0c;也不依赖于向量加法、数乘的具体…

notepad++编辑多个位置

在notepad设置多次点击不同的位置&#xff0c;然后同时操作这多个位置的方法&#xff1a; 1、选择编辑&#xff0c;首选项&#xff1a; 2、选择多点编辑&#xff1a;

数据结构学习笔记—— 排序算法总结【ヾ(≧▽≦*)o所有的排序算法考点看这一篇你就懂啦!!!】

目录 一、排序算法总结&#xff08;一&#xff09;排序算法分类&#xff08;二&#xff09;表格比较 二、详细分析&#xff08;最重要考点&#xff01;&#xff01;&#xff01;&#xff09;&#xff08;一&#xff09;稳定性&#xff08;二&#xff09;时间复杂度&#xff08;…

MapRdeuce工作原理

hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map&#xff1a; Reduce

通讯协议介绍CoAP 协议解析

目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…

Python 判断三位水仙花数

"""判断是否为三位水仙花数知识点&#xff1a;0、水仙花满足条件&#xff1a;(1 ** 3) (5 ** 3) (3 ** 3) 1531、字符串索引&#xff0c;例如&#xff1a;name zhouhua name[0] z2、变量类型转换函数3、双目运算符幂**,例如&#xff1a;3 ** 2 3 * 3 94、…

功能基础篇2——常用哈希和加密算法介绍及Python相关库与实现

加解密 https://docs.python.org/3/library/crypto.html 三方库推荐&#xff0c;https://cryptography.io/en/latest/ Criptography&#xff0c;https://pypi.org/project/cryptography/ PyCryptodome&#xff0c;a fork of PyCrypto&#xff0c;https://pypi.org/project/…

【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本

环境 ubuntu 20.04mongodb 4.4.14还没实际使用&#xff08;20230922&#xff09;后续到10月底如果有问题会修改 原理 只会在有新增数据时生成新的备份日期目录备份恢复时&#xff0c;如果恢复的数据库未删除&#xff0c;则会覆盖数据 准备 准备一个文件夹&#xff0c;用于…

Centos 7 部署SVN服务器

一、安装SVN 1、安装Subversion sudo yum -y install subversion2、验证是否安装成功&#xff08;查看svn版本号&#xff09; svnserve --version二、创建版本库 1、先建立目录&#xff0c;目录位置可修改 mkdir -p /var/svn cd /var/svn2、创建版本库&#xff0c;添加权限…

Unity工具——LightTransition(光照过渡)

需求描述 在游戏中&#xff0c;开发者为了让玩家更直接地看到待拾取的物品从而为其添加一种闪烁效果&#xff0c;或者模拟现实中闪烁的灯光效果&#xff0c;我能够想到的一种方案则是通过控制光照强度来实现&#xff0c;那么本篇文章我们就尝试通过这个方案来实现一下&#xff…

什么是Vue的Vetur插件?它有哪些功能

引言 在现代前端开发中&#xff0c;Vue.js已经成为了一个备受欢迎的JavaScript框架。随着Vue.js的流行&#xff0c;开发人员需要强大的工具来提高他们的生产力和Vue.js项目的质量。Vetur插件是一个为Vue.js开发者提供的强大工具&#xff0c;它不仅提供了丰富的功能&#xff0c…