golang trace view 视图详解

大家好,我是蓝胖子,在golang中可以使用go pprof的工具对golang程序进行性能分析,其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助,鉴于当前对trace view视图的介绍还是很少,在粗略的看过trace统计原理后,我将对这部分做比较详细的介绍。

trace view 视图简介

在go代码里,我们可以通过trace.Start和trace.Stop方法开启和关闭trace统计,之后我们会得到一个trace文件,可以用go tool trace命令打开它·。

go tool trace -http=:8080  trace799152559

在浏览器的打开界面,可以看到trace view视图包含了几个维度的统计信息。

trace 网页显示
view trace 和 goroutine analysis 都是时间线的视图,不过观看的角度不同,view trace 是从processor(Gpm模型中的p) 角度,goroutine analysis 则是从协程角度。

接着是各种类型的profile 视图,包含Network,Sync block,syscall block,scheduler latancy ,这些都可以用于分析系统延迟。

然后是用户自定义的埋点统计,由于本节主要是看原生的trace view视图含义,所以可以先略去这部分。

接着是minimum mutator utilization的视图,它可以用于分析垃圾回收对应用程序的影响。因为协程在分配内存时,在某些条件下也会触发垃圾回收,这将导致这部分时间内,协程不能执行用户程序逻辑,所以这个视图能够看到cpu用了多少时间在执行业务程序,多少时间用于垃圾回收。

接下来,我们仔细分析下各部分视图的含义。

view trace

image.png
如上图所示,整个view trace 分为两个部分,stats和procs部分。

stats

stats 部分统计了在时间线上协程,线程数量,以及堆栈大小的变化情况。

当点击某个一栏数据时,还会显示统计详情,比如点击时间线上线程这一栏,

Pasted image 20230726180033.png
如上图所示,trace view视图最下方会出现当前时刻,处于运行状态和系统调用状态的线程数量。

procs

stats部分比较好理解,我们再来看看procs部分,首先来看下GC这一栏。

GC这一栏也就是视图中时间线上蓝色这一段表示程序在这段时间内,在进行垃圾回收。注意垃圾回收并不是全过程都会STW的,所以在GC这段时间,应用程序还是会对外提供服务的。并且点击蓝色区域,在视图下方还会显示GC开始的堆栈。

Pasted image 20230726180730.png

注意: golang的垃圾回收除了定时扫描回收内存,还会在分配内存时,判断正在执行的协程是否需要执行垃圾回收逻辑,如果需要,则会执行gcStart的逻辑,mallocgc就是golang进行内存分配的函数,所以你可以看到图中的gc正是由于当前协程分配内存才触发执行的,并且同一时期,只能有一个协程执行gcStart逻辑。

接着简单说下Networksyscall 事件,它们在时间线上的点都是解除阻塞时的时间点。

Pasted image 20230726181820.png

然后来看proc这一栏,proc代表的是processor ,它数量一般与cpu核心数相同,也可以通过GOMAXPROCS 设置其数量,协程需要放到proc队里里进行调度执行,proc的时间线上显示的则是各个协程在其上的运行时间。放大trace视图后会看的更加明显。如下图所示:

trace视图中,按w是放大,s是缩小,a是左移,d是右移。

image.png

这里其实要特别注意的是Outgoing flow 并不是直接导致协程在p队列上被切走的事件,实际上导致协程被切走的事件是阻塞事件,Outgoing flow 指的是阻塞事件之后被唤醒的那个时候的事件埋点。

实际上,当前的trace view 视图绘制的时间线不会对阻塞事件进行绘制,只会对EvGoUnblock 事件进行绘制(具体为啥这样设计,我也不知道了🙅🏻‍♀️)不过从协程离开p队列时的堆栈也足够说明协程被切走的原因了。

goroutine analysis

接着我们来看下trace文件中对协程信息的分析。

点击goroutine analysis,出现下面的截图:

Pasted image 20230726210912.png

左边是协程创建时候的堆栈,右边N 代码在这行代码上一共创建了多少个协程。随便选择一行点进去,可以出现下面的截图,

Pasted image 20230726211557.png

如上图所示,有各种的profile graph,这里是对下面所有协程进行统一分析得到的graph图 ,分别是:

Network Wait Time(网络调用时等待,直到数据可达时被唤醒)

Sync Block Time(mutex,channel,wait.Group产生的阻塞)

Blocking Syscall Time(系统调用产生的阻塞)

Scheduler Wait Time(协程阻塞后被唤醒并不会立马执行,而是在队列里等待被调度,这个时间就是等待被调度的时间)

而最下面的表格则是每个协程在这些维度上的消耗时间,这里要注意下两个gc相关的时间只有GC sweeping 才会阻塞协程 ,GC sweeping指的是协程在清除回收内存时的处理时间,而GC pause 指的是采样过程中整个gc的时长,这一列每个协程都是一样的。

请注意,GC 过程中只有发送STW时才会让协程阻塞。

profile graph

关于trcace 分析数据 除了像刚刚的特定堆栈产生的协程做各种延迟维度的分析,trace界面还提供了一个看所有协程的延迟维度的profile graph, 两者的原理都是一致的,只是后者原数据多一些。

拿其中一个维度Scheduler Wait Time的 graph举例:

Pasted image 20230726220954.png

指向每个函数框的箭头都携带了一个时间,例如 273.31us,它代表 函数servserv.init.func1函数等待协程调度的等待时间,注意这个时间不包含它的子函数的时间。时间越大,函数框越大,所以,你在看此类的图的时候,找最大的框就能发现延迟所在。

Minimum mutator utilization

最后我们来看下Minimum mutator utilization 这个视图。这个视图能够观测到垃圾回收对应用程序的影响。

Pasted image 20230726222544.png

如上图所示,纵坐标表示应用除gc外,占用cpu的比例。值越高,说明应用得到的cpu资源越多,gc影响越小,最大值是1表示100%得到cpu资源。图中,最后应用cpu占用率达到了100%,可以暂时不用去管gc方面的影响。如果发现图中cpu资源长时间不能涨上去,则说明程序受gc影响比较大,应该对gc进行优化,像下面这种情况就应该优化gc了。

Pasted image 20230726223559.png

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

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

相关文章

MySQL存储结构及索引

文章目录 MySQL结构1.2存储引擎介绍1.3存储引擎特点InnoDB逻辑存储结构 MyISAMMemory区别及特点存储引擎选择 索引索引概述索引结构BTreeHash索引分类聚集索引&二级索引索引语法SQL性能分析索引优化最左前缀法则范围查询字符串不加引号模糊查询or连接条件数据分布影响覆盖索…

Linux:Shell编程之正则表达式

目录 绪论 1、正则表达式 1.1 通配符 1.2 正则表达式分类 1.3 基本正则 1.4 正则表达式中表示次数的表达式 1.5 位置锚定 1.5.1 词首锚定和词尾锚定 1.6 分组() 1.7 逻辑或 1.8 扩展正则 绪论 正则表达式:有一类特殊字符以及文本…

.NET对象的内存布局

在.NET中,理解对象的内存布局是非常重要的,这将帮助我们更好地理解.NET的运行机制和优化代码,本文将介绍.NET中的对象内存布局。 .NET中的数据类型主要分为两类,值类型和引用类型。值类型包括了基本类型(如int、bool、double、cha…

SQL server 与 MySQL count函数、以及sum、avg 是否包含 为null的值

sql server 与 mysql count 作用一样。 count 计算指定字段出现的个数, 不是计算 null的值 获取表的条数 count(n) n:常数 count(1),count(0)等 count(*) count(字段) 其中字段为null 不会统计在内。 avg(字段)、sum(字段) 跟count(字段)…

VS Code 使用cnpm下载包失败

一、 问题如下: 网上找到的解决方法是要在powershell中执行: Set-ExecutionPolicy RemoteSigned进行更改策略。 首先我们解释下这个Set-ExecutionPolicy RemoteSigned,Set-ExecutionPolicy 是一个 PowerShell 命令,用于控制脚本…

火车头采集伪原创插件【php源码】

大家好,小编来为大家解答以下问题,python代码大全和用法,python代码大全简单,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 1、题目:列表转换为字典。 程序源代码: 1 #!/us…

Dynamo_关于参数赋值

写写关于Dynamo参数赋值 为单个对象赋单个参数值 最容易理解,SetParameterByName需要输入三个参数,元素对象(数据类型:Element),参数名称(数据类型:String),…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO(Non-Blocking IO)是同步非阻塞方式来处理IO数据。…

【ChatGPT 指令大全】怎么使用ChatGPT辅助程式开发

目录 写程式 解读程式码 重构程式码 解 bug 写测试 写 Regex 总结 在当今快节奏的数字化世界中,程式开发变得越来越重要和普遍。无论是开发应用程序、网站还是其他软件,程式开发的需求都在不断增长。然而,有时候我们可能会遇到各种问题…

PCL 计算外接圆的半径

目录 一、算法原理1、计算公式2、主要函数3、源码解析二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。爬虫自重。 一、算法原理 1、计算公式

【毕业项目】自主设计HTTP

博客介绍:运用之前学过的各种知识 自己独立做出一个HTTP服务器 自主设计WEB服务器 背景目标描述技术特点项目定位开发环境WWW介绍 网络协议栈介绍网络协议栈整体网络协议栈细节与http相关的重要协议 HTTP背景知识补充特点uri & url & urn网址url HTTP请求和…

springboot家政服务管理系统java家务保姆资源 jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 springboot家政服务管理系统 系统1权限:管…

C# PDF加盖电子章

winform界面 1.选择加签pdf按钮代码实现 private void button1_Click(object sender, EventArgs e){OpenFileDialog op new OpenFileDialog();op.Filter "PDF文件(*.pdf)|*.pdf";bool flag op.ShowDialog() DialogResult.OK;if (flag){string pdfPath Path.Get…

c语言进阶部分详解(数据在内存中的存储)

大家好,今天要进行梳理的内容是数据在内存中的存储相关内容。 在C语言中,数据在内存中的存储是一个非常重要的概念。了解数据在内存中的存储方式可以帮助我们更好地理解程序的执行过程,优化内存使用,提高程序的性能。 目录 一.数…

《论文阅读13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、论文 研究领域: 城市级3D语义分割论文:Efficient Urban-scale Point Clouds Segmentationwith BEV Projection论文链接 注: BEV: Birds Eye View BEV投影是指鸟瞰视角(Birds Eye View,简称BEV)的一种从上方观看对象或场景的…

gin和gorm框架安装

理论上只要这两句命令 go get -u gorm.io/gorm go get -u github.com/gin-gonic/gin然而却出现了问题 貌似是代理问题,加上一条命令 go env -w GOPROXYhttps://goproxy.cn,direct 可以成功安装 安装gorm的数据库驱动程序 go get -u gorm.io/driver/mysql

go错误集(持续更新)

1.提示以下报错 Build Error: go build -o c:\Users\Administrator\Desktop__debug_bin2343731882.exe -gcflags all-N -l . go: go.mod file not found in current directory or any parent directory; see ‘go help modules’ (exit status 1) 解决办法: go …

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…

机器学习笔记:李宏毅ChatGPT:生成式学习的两种策略

1 策略1 “各个击破”——autoregressive model “各个击破”——一个一个生成出来 2 策略2 : “一次到位”——non-autoregressve model 一步到位,全部生成出来 2.1 non-autoregressive model 如何确定长度? 两种策略 策略1:始…

【1572. 矩阵对角线元素的和】

来源:力扣(LeetCode) 描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3]…