golang使用trace进行goroutine阻塞分析

139 阅读1分钟

代码

package main

import (
	"log"
	"os"
	"runtime/trace"
	"sync"
	"syscall"
	"time"
)

type Dog struct {
	mu   sync.Mutex
	name string
}

func (d *Dog) Name() {
	d.mu.Lock()
	time.Sleep(200 * time.Millisecond)
	d.mu.Unlock()
}

func traceProfile() {
	f, err := os.OpenFile("trace.out", syscall.O_CREAT|syscall.O_RDWR, os.ModePerm)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Trace started")
	trace.Start(f)
	defer trace.Stop()
	d := &Dog{}
	for i := 0; i < 100; i++ {
		go func() {
			d.Name()
		}()
	}
	time.Sleep(10 * time.Second)
}
func main() {
	traceProfile()
}

结果

所有的g,都阻塞在Dog.Name方法上 image.png image.png