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视图包含了几个维度的统计信息。

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

如上图所示,整个view trace 分为两个部分,stats和procs部分。
stats
stats 部分统计了在时间线上协程,线程数量,以及堆栈大小的变化情况。
当点击某个一栏数据时,还会显示统计详情,比如点击时间线上线程这一栏,

如上图所示,trace view视图最下方会出现当前时刻,处于运行状态和系统调用状态的线程数量。
procs
stats部分比较好理解,我们再来看看procs部分,首先来看下GC这一栏。
GC这一栏也就是视图中时间线上蓝色这一段表示程序在这段时间内,在进行垃圾回收。注意垃圾回收并不是全过程都会STW的,所以在GC这段时间,应用程序还是会对外提供服务的。并且点击蓝色区域,在视图下方还会显示GC开始的堆栈。

注意: golang的垃圾回收除了定时扫描回收内存,还会在分配内存时,判断正在执行的协程是否需要执行垃圾回收逻辑,如果需要,则会执行gcStart的逻辑,mallocgc就是golang进行内存分配的函数,所以你可以看到图中的gc正是由于当前协程分配内存才触发执行的,并且同一时期,只能有一个协程执行gcStart逻辑。
接着简单说下Network和syscall 事件,它们在时间线上的点都是解除阻塞时的时间点。

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

这里其实要特别注意的是Outgoing flow 并不是直接导致协程在p队列上被切走的事件,实际上导致协程被切走的事件是阻塞事件,Outgoing flow 指的是阻塞事件之后被唤醒的那个时候的事件埋点。
实际上,当前的trace view 视图绘制的时间线不会对阻塞事件进行绘制,只会对EvGoUnblock 事件进行绘制(具体为啥这样设计,我也不知道了🙅🏻♀️)不过从协程离开p队列时的堆栈也足够说明协程被切走的原因了。
goroutine analysis
接着我们来看下trace文件中对协程信息的分析。
点击goroutine analysis,出现下面的截图:

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

如上图所示,有各种的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举例:

指向每个函数框的箭头都携带了一个时间,例如 273.31us,它代表 函数servserv.init.func1函数等待协程调度的等待时间,注意这个时间不包含它的子函数的时间。时间越大,函数框越大,所以,你在看此类的图的时候,找最大的框就能发现延迟所在。
Minimum mutator utilization
最后我们来看下Minimum mutator utilization 这个视图。这个视图能够观测到垃圾回收对应用程序的影响。

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

相关文章:
golang trace view 视图详解
大家好,我是蓝胖子,在golang中可以使用go pprof的工具对golang程序进行性能分析,其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助,鉴于当前对trace view视图的介绍还是很少,在粗略的看过tra…...
zju代码题:4-6
一 分段函数算水费 #include <stdio.h>int main() {/*** 定义两个* 定义浮点型变量* y:水费* x:用水的吨数* */double x, y;printf("Enter x(x>=0):\n"...
数据链路层概述
数据传输过程如下: 数据包按上述过程传输,详见(计算机网络概述三)。在分析数据链路层时可以假象成其沿着水平传播。 这三段链路层的传播方式可能会有所不同。 基本概念: 链路:指一个节点到相邻节点的一段物…...
Python代码使用技巧汇总:提升你的编程技能
各位程序员朋友们,今天我要跟大家分享一些关于Python代码的最佳使用技巧,这些技巧可以帮助你们成为更专业且高效的程序员。不管你是刚刚入门还是已经有一些经验,这些技巧都能够为你提供实际操作价值。 一、合理使用Python的数据结构和算法&am…...
Ae 效果:CC Spotlight
透视/CC Spotlight Perspective/CC Spotlight CC Spotlight(CC 聚光灯) 主要用途是创建和控制逼真的聚光灯效果。通过调整这些属性,可以模拟出各种不同的照明环境和效果,比如舞台照明、日出日落、特定的颜色照明等。 ◆ ◆ ◆ 效…...
如何在页面中嵌入音频和视频?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 嵌入音频⭐ 嵌入视频⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…...
Unity 中检测射线穿过的所有的物体
在开发中 有个需求,射线要检测所有穿过的物体。 代码如下: using UnityEngine;public class HitCollider : MonoBehaviour {public float raycastDistance Mathf.Infinity;// Update is called once per framevoid Update(){Ray ray Camera.main.Scre…...
LeetCode 29题:两数相除
题目 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.…...
Axure RP9中使用Echarts示例
目录 在Axure中拖入一个矩形框,并命名tes 进入Echarts官网示例页面https://echarts.apache.org/examples/zh/index.html 选择自己需要的图表,修改数据,并复制左侧js代码 把上面复制的代码替换下方的option{}; javascript: var script docum…...
利用Jmeter做接口测试全流程分析
利用Jmeter做接口测试怎么做呢?过程真的是超级简单。 明白了原理以后,把零碎的知识点填充进去就可以了。这篇文章就来介绍一下如何利用Jmeter做接口测试的流程,主要针对的是功能测试。暂不涉及到自动化测试和性能测试的内容。 一把来说&…...
超级浏览器与指纹浏览器:功能与特点的比较
导语:随着互联网的快速发展,隐私和安全问题日益受到关注。在这个背景下,超级浏览器和指纹浏览器作为定制化浏览器的两个重要类型,各自具有独特的功能和特点。本文将对超级浏览器和指纹浏览器进行比较,帮助读者更好地理…...
云端同步、高效无界:5款免费的跨平台思维导图软件推荐!
思维导图是一种以图形化方式表示思想、概念或任务的方法,可以帮助用户梳理思维、提高记忆和理解。在工作中,思维导图可以用于会议记录、任务规划、项目管理等,帮助提高工作效率和团队协作能力;在学习中,思维导图可以用…...
OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能
🦉 AI新闻 🚀 OpenAI推出新功能,允许网站阻止其网络爬虫抓取数据训练GPT模型 摘要:OpenAI最近推出了一个新功能,允许网站阻止其网络爬虫从其网站上抓取数据训练GPT模型。该功能通过在网站的Robots.txt文件中禁止GPTB…...
SpringBoot操作Jedis
SpringBoot操作Jedis 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…...
实现静态资源访问的几种方法
什么是静态资源? 静态资源是指在服务器端存储的不会变化的文件,如HTML、CSS、JavaScript、图片、音频、视频等文件。这些文件一般不包含动态内容,每次请求时返回的内容都是固定的。 为什么要使用静态资源? 提升网站性能…...
chrome 下 autocomplete=off (禁止记住密码)不起作用解决方案
chrome 下 autocompleteoff (禁止记住密码)不起作用解决方案: 不知道是否是CHROME一个BUG,按说不应该,但事实它确实存在。 因时间关系,懒得查阅官方资料,这类问题解锁容易,思路如下: 初始化设置…...
设计模式-简单工厂模式(静态工厂模式)java实现
介绍 简单工厂模式根据所提供的参数数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。 意图 提供一个类,负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator…...
如何共享笔记本电脑网络
为了让手机连接笔记本网络,我们通常通过在笔记本上安装诸如WiFi共享精灵来实现,其实没有那么麻烦: 1、在电脑上打开“设置”—>选择“网络和Internet”—>选择“移动热点”(如果系统是Windows 7或更低版本,则需要…...
Android 高级进阶知识整理
Android Framework 启动流程 init 进程启动过程 Android系统启动流程 Zygote启动流程及源码分析 APP启动流程 init进程是Android用户空间第一个进程,主要做以下3件事情: 创建和挂载启动所需的文件目录。初始化和启动关键服务,守护关键…...
一文详解 DolphinDB SQL 标准化
为了提升用户体验,降低用户学习成本和脚本迁移复杂度,自 1.30.17 / 2.00.5 版本开始,DolphinDB 逐步支持了标准化 SQL 的书写方法;并于 1.30.22 / 2.00.10 版本起,对标准 SQL 的常用语法和关键字实现了兼容。 1. 与标…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
