Golang 23_Golang性能跟踪工具trace

一、Golang性能跟踪工具trace简介

1.1 Golang性能跟踪工具trace

trace 是Golang的一个性能跟踪工具,可以用于分析程序在一段时间内的执行情况。以下是使用trace的基本步骤:

  • 在代码中导入 runtime/trace 包;
  • 在程序中使用 trace.Starttrace.Stop 来启动和停止跟踪。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
    "os"
    "log"
    "runtime/trace"
)

func main() {
    // ...
    fd, err := os.Create("trace.out")
    if err != nil {
        log.Fatal(err)
    }
    defer fd.Close()

    err = trace.Start(fd)
    if err != nil {
        log.Fatal(err)
    }
    defer trace.Stop()
    // ...
} 
  • 运行程序并等待它执行一段时间;
  • 使用 go tool trace 命令加载跟踪输出文件并进行分析。例如:
1
go tool trace trace.out

这将启动可视化界面,打开一个浏览器窗口,显示程序的跟踪数据,包括事件图、调用堆栈、Goroutine等信息。

可视化界面上展示的各项指标:

  • View trace:查看跟踪
  • Goroutine analysis:Goroutine 分析
  • Network blocking profile:网络阻塞概况
  • Synchronization blocking profile:同步阻塞概况
  • Syscall blocking profile:系统调用阻塞概况
  • Scheduler latency profile:调度延迟概况
  • User defined tasks:用户自定义任务
  • User defined regions:用户自定义区域
  • Minimum mutator utilization:最低 Mutator 利用率

trace 的各项指标详细说明参考博文:https://blog.csdn.net/u013474436/article/details/105232768/

1.2 使用go tool trace能解决什么问题

1、诊断延迟问题

当完成关键任务的goroutine被阻止运行时,可能会引起延迟问题。 可能的原因有很多:做系统调用时被阻塞; 被共享内存阻塞(通道/互斥等); 被runtime系统(例如GC)阻塞,甚至可能调度程序不像想要的那样频繁地运行关键goroutine。

所有这些都可以使用go tool trace来识别。可以通过查看PROCs时间线来跟踪问题,并发现一段时间内goroutine被长时间阻塞。一旦确定了这段时间,应该给出一个关于根本原因的线索。

2、诊断并行问题

并行运行代码往往效率较低; 特别是在goroutine是非常短暂的,或者他们之间有很多的竞争的情况下。 这是使用此工具的另一个原因:尝试这两种方法,并检查哪种工作最适合您的用例。