Go:執行跟蹤變得更加強大

簡介

Go 語言的 runtime/trace 包含一個強大的工具,用於理解和排查 Go 程序。其中的功能允許跟蹤每個 goroutine 在一段時間內的執行情況。然後,使用 go tool trace 命令(或優秀的開源工具 gotraceui)可以可視化和探索這些跟蹤中的數據。

跟蹤的魔力在於,它可以輕鬆地揭示程序中其他方式難以看到的東西。例如,在 CPU 概要文件中很難看到併發瓶頸,因爲沒有要採樣的執行。但在執行跟蹤中,缺乏執行將以驚人的清晰度顯示出來,並且被阻塞的 goroutine 的堆棧跟蹤將迅速指向罪魁禍首。Go 開發人員甚至可以爲自己的程序添加任務、區域和日誌,以便將他們更高層次的關注點與更低層次的執行細節相關聯。

問題

不幸的是,執行跟蹤中的大量信息通常無法獲取。歷史上,四個主要問題阻礙了跟蹤:

改進

Go 1.20 和 Go 1.21 中引入了許多改進,以解決這些問題。這些改進包括:

結果

這些改進使 Go 執行跟蹤成爲一種更強大、更易於使用的工具。它們使 Go 開發人員能夠更輕鬆地理解和排查其程序中的併發問題。

示例

以下是一個示例,說明如何使用 Go 1.21 中的新 API 啓動跟蹤:

Go

func main() {
  // Start a trace lasting for 1 second.
  trace.Start(trace.Options{Duration: time.Second})

  // Do some work.
  for i := 0; i < 1000000; i++ {
    // ...
  }

  // Stop the trace.
  trace.Stop()
}

然後,可以使用 go tool trace 命令可視化跟蹤:

go tool trace main.trace

結論

Go 執行跟蹤是理解和排查 Go 程序中併發問題的強大工具。Go 1.20 和 Go 1.21 中的改進使跟蹤更加強大、易於使用。Go 開發人員應該考慮將跟蹤作爲其工具集的一部分。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vfRPPaaVW4xdRxan7tMVBg