[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
- 浏览器会弹出
trace
的web 页面
,如下
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 线程 | 显示在执行期间有多少个线程在运行,其蕴含正在调用 Syscall (InSyscall )、运行中(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 网关,
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 小魔童哪吒,欢送点赞关注珍藏,下次见~