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.mzph.cn/news/88340.shtml

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

相关文章

医院电子病历编辑器,EMRE(EMR Editor)源码

电子病历主要面向医院机构医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;为医疗…

asisctf 2023 web hello wp

hello 开题&#xff0c;直接给了源码。 <?php /* Read /next.txt Hint for beginners: read curls manpage. */ highlight_file(__FILE__); $url file:///hi.txt; if(array_key_exists(x, $_GET) &&!str_contains(strtolower($_GET[x]),file) && !str_c…

TVP专家谈腾讯云 Cloud Studio:开启云端开发新篇章

导语 | 近日&#xff0c;由腾讯云 TVP 团队倾力打造的 TVP 吐槽大会第六期「腾讯云 Cloud Studio」专场圆满落幕&#xff0c;6 位资深的 TVP 专家深度体验腾讯云 Cloud Studio 产品&#xff0c;提出了直击痛点的意见与建议&#xff0c;同时也充分肯定了腾讯云 Cloud Studio 的实…

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…

ROS2 从头开始:第 5 部分 - 并发、执行器和回调组

一、说明 让我们回到基础。并发意味着系统或软件可以同时运行许多任务。例如,在单核 CPU 机器上,可以通过使用线程来实现并发。本文探讨了

基于边缘智能网关的储充一体电站管理方案

在“2030碳达峰&#xff0c;2060碳中和”的目标下&#xff0c;我国持续加快推进能源转型&#xff0c;扩大新能源占比&#xff0c;全国各地都在部署建设光伏、储能、新能源汽车充电等应用。随着新能源汽车的广泛普及&#xff0c;充电站、充电桩的需求快速增加&#xff0c;行业也…

分享从零开始学习网络设备配置--任务3.8 使用动态路由OSPF实现网络连通

任务描述 某公司随着规模的不断扩大&#xff0c;路由器的数量在原有的基础上有所增加。网络管理员发现原有的路由协议已经不适合现有的网络环境&#xff0c;可实施动态路由OSPF协议配置&#xff0c;实现网络中所有主机之间互相通信。因为动态路由OSPF协议可以实现快速收敛&…

zabbix实现钉钉报警

首先钉钉创建一个团队 自定义关键词 查看zabbix-server脚本存放的位置&#xff1a; [rootcontrolnode ~]# grep ^AlertScriptsPath /etc/zabbix/zabbix_server.conf AlertScriptsPath/usr/lib/zabbix/alertscripts zabbix server设置 在配置文件书写脚本目录vim /etc/za…

Redis的softMinEvictableIdleTimeMillis和minEvictableIdleTimeMillis参数

背景&#xff1a; Redis的softMinEvictableIdleTimeMillis&#xff0c;minEvictableIdleTimeMillis是一个令人疑惑两个参数&#xff0c;特别是当它和minIdle组合起来时就更难理解了&#xff0c;本文就来梳理下他们的之间的关系 softMinEvictableIdleTimeMillis&#xff0c;mi…

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

华为乾坤区县教育安全云服务解决方案(1)

华为乾坤区县教育安全云服务解决方案&#xff08;1&#xff09; 课程地址方案背景客户痛点分析区县教育网概述区县教育网业务概述区县教育网业务安全风险分析区县教育网安全运维现状分析区县教育网安全建设痛点分析 安全解决方案功能概述架构概述方案架构设备选型 课程地址 本…

系统架构设计师(第二版)学习笔记----软件工程

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----软件工程 文章目录 一、软件工程1.1 软件危机的表现1.2 软件工程的内容 二、软件过程模型2.1 软件的声明周期2.2 瀑布模型2.3 瀑布模型的缺点2.4 原型模型2.5 原型模型开发阶段2.6 开发原型的途径2.7 螺旋…

OpenCV实现FAST算法角点检测 、ORB算法特征点检测

目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 &#xff0c;ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 5. 模型评估 相关其它博客工程源代码下载其它资料下载 前言 本项目依赖于Keras深度学习模型&#xff0c;旨在对…

Mybatis-Flex框架初体验

本篇文章内容主要包括&#xff1a; MyBatis-Flex 介绍 MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用Mybaits-Flex链接任何数据库&#xff0c;其内置的QueryWrapper亮点帮助我们极大的减少了SQL编写的工…

企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)

一、安装完虚拟机后的操作 第一步: 第二步&#xff1a;分配的内存大一下&#xff0c;处理器多些 第三步&#xff1a;打开虚拟化 打开虚拟机、安装KVM 一般企业如果使用kvm虚拟化平台&#xff0c;都会把物理服务器装成Centos的操作系统&#xff0c;然后装上kvm&#xff0c;创建…

crypto:摩丝

题目 根据题目所给的压缩包下载后解压&#xff0c;打开文本提示 摩斯密码&#xff0c;对照表可解码得到flag

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测&#…

Cesium 问题:三维场景下添加的实体会被遮挡

文章目录 问题分析 问题 在三维场景下&#xff0c;我们添加的实体会被遮挡导致显示不够完整&#xff0c;例如 而应该的效果如下 分析 在三维场景中&#xff0c;实体可能会被以下几类物体或因素所遮挡&#xff1a; 地形&#xff1a;如果实体位于地球表面附近&#xff0c;地形…

GoLang 百行代码实现小项目《家庭收支软件》

界面显示 实现思路 GoLang 百行代码实现的小项目《家庭收支软件》是一个简单的家庭收支记账软件&#xff0c;可以通过命令行界面记录和显示收支明细。 在代码中&#xff0c;定义了两个结构体类型&#xff1a;record&#xff08;代表一条收支记录&#xff09;和software&#…