Go:執行跟蹤變得更加強大
簡介
Go 語言的 runtime/trace 包含一個強大的工具,用於理解和排查 Go 程序。其中的功能允許跟蹤每個 goroutine 在一段時間內的執行情況。然後,使用 go tool trace 命令(或優秀的開源工具 gotraceui)可以可視化和探索這些跟蹤中的數據。
跟蹤的魔力在於,它可以輕鬆地揭示程序中其他方式難以看到的東西。例如,在 CPU 概要文件中很難看到併發瓶頸,因爲沒有要採樣的執行。但在執行跟蹤中,缺乏執行將以驚人的清晰度顯示出來,並且被阻塞的 goroutine 的堆棧跟蹤將迅速指向罪魁禍首。Go 開發人員甚至可以爲自己的程序添加任務、區域和日誌,以便將他們更高層次的關注點與更低層次的執行細節相關聯。
問題
不幸的是,執行跟蹤中的大量信息通常無法獲取。歷史上,四個主要問題阻礙了跟蹤:
-
跟蹤的開銷很高。
-
跟蹤無法很好地擴展,並且可能變得太大而無法分析。
-
經常不清楚何時開始跟蹤以捕獲特定的錯誤行爲。
-
難以將跟蹤數據與程序的源代碼相關聯。
改進
Go 1.20 和 Go 1.21 中引入了許多改進,以解決這些問題。這些改進包括:
-
更高效的跟蹤機制,可降低開銷並提高可伸縮性。
-
新的 API,可更輕鬆地啓動和停止跟蹤以及控制跟蹤的範圍。
-
改進的工具,可用於可視化和探索跟蹤數據。
-
新的工具,可將跟蹤數據與程序的源代碼相關聯。
結果
這些改進使 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