乐趣区

关于后端:go的请求追踪神器go-tool-trace

[TOC]

gRPC 的申请追踪

前言

咱们来回顾一下之前分享的知识点:

  • gRPC 介绍

介绍了根本你的 gRPC 的应用形式,框架,交互方式等

  • gRPC 的认证

分享了 gRPC 的四种认证形式中重要的 2 种形式,有趣味能够点击看看哦

  • openssl 证书生成笔记(go 1.15 版本以上)

整顿了 openssl 证书的生成,关键点曾经高亮标注,值得一看

  • gRPC 的拦截器

gRPC 生态中的中间件,次要是做对立认证工作,不必要在每一个接口中都写一次认证形式

文章中有分享 gRPC 的各种性能的中间件,有趣味能够点击链接,大佬们还请不吝赐教

go tool trace

明天咱们来介绍一下go 的申请追踪,也就是说go Trace,分享 trace 有如下几个起因:

  • 学习完 trace 之后,你可能本人去实际,清晰的理解整个程序的调用栈
  • 能够通过追踪器捕捉大量信息,如图

  • 能够更快的解决咱们我的项目中的疑难杂症

咱们或者都有这样的领会,本人思考明确,设计进去的程序,能够很清晰明了的将细节解释明确,对性能的增删改也是能够做到灵便应答。

可是让咱们一下子去批改他人写的性能或模块的时候,很多时候会一脸懵逼,这也不敢动,那也不敢动,在不了解的状况下,有疑难,肯定要问分明原理和逻辑,否则搞不好就是线上问题。

如上状况,最重要的一个起因就是本人对以后模块 / 性能的相熟水平,以及本人的思维模型是否可迁徙。

总而言之,对程序,要有敬畏之心,好奇之心,坚持不懈专研上来,要有解决问题的信心。

用 go tool trace 具体哪些地方适合,哪些地方不适合?

不适合

  • 运行迟缓的函数,或者找到大部分 CPU 工夫破费在哪里,术业有专攻,看 CPU 工夫破费,是有专门的工具的 go tool pprof

适合

  • 找出程序在一段时间内正在做什么
  • go tool trace 能够通过 view trace链接提供的其余可视化性能,对于诊断争用问题帮忙极大

开始写一个 DEMO

GOMAXPROCS设置能够同时执行的 cpu 的最大数量,此处咱们设置为 1

server.go

package main

import (
   "context"
   "fmt"
   "os"
   "runtime"
   "runtime/trace"
   "sync"
)

func main() {
   // 应用 GOMAXPROCS 设置能够同时执行的 cpu 的最大数量 为 1 个
   runtime.GOMAXPROCS(1)

   f, _ := os.Create("myTrace.dat")
   defer f.Close()


   // 开始跟踪,在跟踪时,跟踪将被缓冲并写入 一个咱们指定的文件中
   _ = trace.Start(f)
   defer trace.Stop()

   // 咱们自定义一个工作
   ctx, task := trace.NewTask(context.Background(), "customerTask")
   defer task.End()

   var wg sync.WaitGroup
   wg.Add(10)
   for i := 0; i < 10; i++ {
      // 启动 10 个协程,模仿做工作
      go func(num string) {defer wg.Done()

         // 标记  num
         trace.WithRegion(ctx, num, func() {
            var sum, i int64
            // 模仿执行工作
            for ; i < 500000000; i++ {sum += i}
            fmt.Println(num, sum)
         })
      }(fmt.Sprintf("num_%02d", i))
   }
   wg.Wait()}

操作步骤:

  • 编译并运行会生成咱们既定好的数据文件
  • 通过 go tool trace + myTrace.dat
  • 浏览器会弹出 traceweb 页面,如下

tag 阐明
View trace 查看可视化的跟踪状况
Goroutine analysis 协程剖析
Network blocking profile (⬇) 网络拥塞状况
Synchronization blocking profile (⬇) 同步阻塞状况
Syscall blocking profile (⬇) 零碎调用阻塞状况
Scheduler latency profile (⬇) 调度提早状况
User-defined tasks 用户自定义的工作
User-defined regions 用户自定义的区域
Minimum mutator utilization 最低 Mutator 利用率

View trace

可视化的 web 追踪页面

tag 阐明
工夫线 用于显示执行的工夫单元,依据工夫维度的不同能够调整区间,能够点击按钮,便能够在界面上拖拽工夫线
用于显示执行期间的内存调配和开释状况
协程 用于显示在执行期间的每个 Goroutine 运行阶段有多少个协程在运行,其蕴含 GC 期待(GCWaiting)、可运行(Runnable)、运行中(Running)这三种状态。
OS 线程 显示在执行期间有多少个线程在运行,其蕴含正在调用 SyscallInSyscall)、运行中(Running)这两种状态。
虚构处理器 每个虚构处理器显示一行,虚构处理器的数量个别默认为零碎内核数。
协程和事件 显示在每个虚构处理器上有什么 Goroutine 正在运行,而连线行为代表事件关联。

能够应用 shift + ? 唤出帮忙手册

点击 PROC 色彩区域

能够看到该处理器此段时间再做什么事件,如图

tag 阐明
Start 开始工夫
Wall Duration: 持续时间
Self Time 执行工夫
Start Stack Trace 开始时的堆栈信息
End Stack Trace 完结时的堆栈信息
Incoming flow 输出流
Outgoing flow 输入流
Preceding events 之前的事件
Following events 之后的事件
All connected 所有连贯的事件

Event(s)下方的 Preceding events 点击进去能够看到每一个调用栈的 执行工夫

用户自定义工作如何查看?

  • User-defined tasks
  • 点击 Count
  • goroutine view
  • 点击色彩区域

即可看到此段时间的调用栈,开始工夫,完结工夫,以及用户定义的工作开了多少个协程等等

User-defined tasks

点击 Count

点击 goroutine view

点击色彩区域

即可看到此段时间具体在执行什么动作,具体的信息如下

用户自定义区域如何查看呢?

与上述查看用户自定义工作的形式大同小异,如下

  • User-defined regions
  • 点击具体的 Count

User-defined regions

点击具体的 Count

即可查看到此协程的总共耗时,网络拥塞,同步阻塞,零碎调用阻塞,调度期待,垃圾回收扫描,垃圾回收暂停的相干参数信息

那么某一些要害的 goroutine 被阻止运行时,可能会有提早问题,大略的起因置信大家应该有些谱了吧

  • 零碎调用时被阻塞;
  • 被共享内存阻塞(通道 / 互斥等)
  • 调度程序没有依照咱们所冀望的频率运行协程
  • 被 runtime 零碎(例如 GC)阻塞

正好上述起因的追踪都能够应用 go tool trace 辨认到,对于咱们追踪问题,查问问题原理起了很好的助力作用

好了,本次就到这里,下一次分享 gRPC 的 HTTP 网关

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 小魔童哪吒,欢送点赞关注珍藏,下次见~

退出移动版