golang 协程追踪术

本文介绍了如何在Golang中进行协程追踪,包括通过代码插入追踪、Goroutine分析、网络阻塞概况、同步和系统调用阻塞分析等。通过示例展示了如何理解并使用trace功能,以及自定义Task和Region进行特定分析。同时提到了Minimum Mutator Utilization图用于评估GC性能,并提醒读者注意Chrome浏览器版本和网络条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

对于绝大部分服务,跟踪刨析是用不到的。但是如果遇到了下面问题,可以不妨一试:

  • 怀疑哪个协程慢了
  • 系统调用有问题
  • 协程调度问题 (chan 交互、互斥锁、信号量等)
  • 怀疑是 gc (Garbage-Collect) 影响了服务性能
  • 网络阻塞
  • 等等

坦白的讲,通过跟踪刨析可以看到每个协程在某一时刻在干什么。

做跟踪刨析,首先需要获取trace 数据。可以通过代码中插入trace, 或者上节提到的通过pprof 下载即可。

Example

Code

下面通过代码直接插入的方式来获取trace. 内容会涉及到网络请求,涉及协程异步执行等。

package main

import (
	"io/ioutil"
	"math/rand"
	"net/http"
	"os"
	"runtime/trace"
	"strconv"
	"sync"
	"time"
)


var wg sync.WaitGroup
var httpClient = &http.Client{
   Timeout: 30 * time.Second}

func SleepSomeTime() time.Duration{
   
	return time.Microsecond * time.Duration(rand.Int()%1000)
}

func create(readChan chan int) {
   
	defer wg.Done()
	for i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值