Go開發團隊更新執行環境的追蹤(Trace)套件,不僅大幅降低執行追蹤的CPU開銷,還透過定期分割追蹤檔控制追蹤檔案大小,進而增加了追蹤的可擴展性。此外,新的更新還支援持續追蹤功能,並提供追蹤讀取器API,使得追蹤資料更容易共享與存取。

Go的runtime/trace套件是一組工具,目的在於協助開發者進一步理解與排除程式故障,其允許開發者追蹤每個goroutine的活動,並透過go tool trace指令,視覺化並探索追蹤裡的資料。開發者能夠於程式中加入特定的標註,包括任務、區域和日誌,將程式的邏輯流程、效能表現和錯誤處理,與底層諸如程式的執行時機、資源使用和呼叫堆疊等執行細節相關聯,使開發者更能監控和分析程式,解決效能瓶頸等問題。

雖然Go的執行追蹤可提供豐富的資訊,但也存在一些長期問題,像是追蹤成本偏高,會對程式的執行效能造成明顯的影響,因此難以用在生產環境中。追蹤也難以擴展,當追蹤產生的資料量太大,將導致追蹤檔難以分析。

另外,啟動追蹤的時機也不夠明確,開發者往往不清楚何時啟動追蹤,才能確定捕捉到特定的錯誤行為,造成追蹤分析困難。而且因為缺乏解析執行追蹤的公共套件,因此也只有資深的Go開發者有能力進行程式化分析追蹤。

開發團隊開始著手解決這些問題,在之前的Go版本,追蹤在許多應用程式會導致10-20% CPU執行開銷,這使得追蹤被限制在特定的使用情境,而不能像CPU分析那樣持續使用,開發團隊解釋,這是因為在啟動執行追蹤時,執行環境會生成許多事件,這些事件大多數附加了堆疊追蹤,這些堆疊追蹤對於辨識goroutine在執行的任務非常有用,但是成本也很高。

開發團隊指出,追蹤的大部分成本發生在回溯,因此透過最佳化回溯效率,追蹤執行環境的CPU開銷已經大幅降低至1-2%,如此開發者便可以頻繁地使用追蹤來監控和診斷應用程式,且不會對效能產生太大的影響。

另外,在新版本中,追蹤分析變得可擴展。過去追蹤檔的格式和事件的設計講究有效性,但是需要工具來解析和保留整個追蹤狀態,數百MiB的追蹤可能需要數GiB的記憶體來分析,而新的追蹤功能進行了調整,透過定期分割正在生成的追蹤檔,使每一個追蹤檔的大小降低,而由於追蹤檔變小,分析工具便不需要一次性載入龐大的追蹤檔到記憶體中,因此也降低了所需要的記憶體。

之前的追蹤事件,是寫入各自執行緒自己的快取位置,這代表事件的出現並不符合真實順序,而新的方法會在分割追蹤檔時重新同步,因此也讓事件更容易按真實順序重組,減少了分析工具的負擔。整體來說,新的分割機制讓追蹤資料更容易管理且分析,開發者也能更快地找到感興趣的事件,讓效能分析更有效。

Go追蹤現在也支援持續追蹤紀錄(Flight Recording),可讓程式一直保持在追蹤狀態,紀錄近期發生的事,而這項功能也是因為追蹤分割技術的導入,才使得持續追蹤變得可行。而隨著開發團隊重寫追蹤實作,也提供了一個新的追蹤讀取器API,讓開發者更容易存取追蹤資料。

熱門新聞

Advertisement