![]()
作者 | Sergio De Simone
譯者 | 平川
在 5 年時(shí)間里,Datadog Agent 從 428 MiB 增長到了 1.22 GiB。Datadog 工程師們開始著手縮減其二進(jìn)制文件的大小。他們 發(fā)現(xiàn),對(duì)于大多數(shù) Go 二進(jìn)制文件,膨脹的主要原因是隱藏的依賴項(xiàng)、禁用的鏈接器優(yōu)化以及 Go 編譯器和鏈接器中的微妙行為。
不管是對(duì)于我們自己,還是對(duì)于我們的用戶,這種增長都產(chǎn)生了不利的影響:網(wǎng)絡(luò)成本和資源使用增加,Agent 感知變差,并且在資源受限的平臺(tái)上使用 Agent 變得更加困難。
Datadog 軟件工程師 Pierre Gimalac 寫道,為了解決這個(gè)問題,他們采取了一些措施,以便盡可能地縮小二進(jìn)制文件的大小,其中包括:審計(jì)導(dǎo)入項(xiàng)、隔離可選代碼以及消除反射 / 插件陷阱。
實(shí)際上,在分析了 Agent 的增長情況后,Datadog 工程師發(fā)現(xiàn),這主要是由新功能、額外的集成和大型第三方依賴項(xiàng)(如 Kubernetes SDK)引起的。特別是,Go 的依賴模型包括傳遞性導(dǎo)入,使得即使是一個(gè)小的變化也可能引入數(shù)百個(gè)包。
Datadog 工程師設(shè)計(jì)了兩種實(shí)用的方法來移除不必要的依賴項(xiàng):使用構(gòu)建標(biāo)簽(//go:build feature_x)來排除可選代碼,并將代碼移到單獨(dú)的包中,從而使非可選包盡可能保持小巧。這兩種技術(shù)都需要系統(tǒng)地審計(jì)導(dǎo)入項(xiàng),以便確定哪些文件或包可以從給定的構(gòu)建中排除。例如,僅僅將一個(gè)函數(shù)移動(dòng)到它自己的包中,就從一個(gè)不使用它的二進(jìn)制文件中移除了約 570 個(gè)包和約 36 MB 的生成代碼。
審計(jì)依賴項(xiàng)并不是一項(xiàng)簡單的任務(wù),但 Go 生態(tài)系統(tǒng)提供了三個(gè)有用的工具:go list,可以列出構(gòu)建中使用的所有包;goda,可以可視化依賴圖和導(dǎo)入鏈,幫助開發(fā)人員理解為什么需要某個(gè)特定的依賴項(xiàng);go-size-analyzer,可以顯示每個(gè)依賴項(xiàng)使二進(jìn)制文件的空間占用增加了多少。
除了優(yōu)化依賴項(xiàng)外,通過最小化反射機(jī)制的使用,Datadog 工程師額外獲得了 20% 的大小縮減。反射會(huì)悄悄地禁用一些鏈接器優(yōu)化,包括死代碼消除:
如果你使用非恒定方法名,那么鏈接器在構(gòu)建時(shí)就無法知道哪些方法將在運(yùn)行時(shí)被使用。因此,它需要保留每個(gè)可達(dá)類型的每個(gè)導(dǎo)出方法,以及它們所依賴的所有符號(hào),這可能會(huì)大幅增加最終二進(jìn)制文件的大小。
為了解決這個(gè)問題,他們盡可能地消除了動(dòng)態(tài)反射,無論是在他們的代碼庫中還是在依賴項(xiàng)中。后一步驟需要向 kubernetes/kubernetes、uber-go/dig、google/go-cmp 等項(xiàng)目提交多個(gè) PR。
另一個(gè)禁用死代碼消除的功能是 Go 插件(一種允許 Go 程序在運(yùn)行時(shí)動(dòng)態(tài)加載 Go 代碼的機(jī)制)。實(shí)際上,僅僅導(dǎo)入 plugin 包就導(dǎo)致鏈接器將二進(jìn)制文件視為動(dòng)態(tài)鏈接的,“這會(huì)禁用方法死代碼消除,甚至迫使鏈接器保留所有未導(dǎo)出的方法”。在部分構(gòu)建中,這一變化額外帶來了約 20% 的縮減。
最后,Gimalac 強(qiáng)調(diào),這些改進(jìn)是在六個(gè)月的時(shí)間里實(shí)現(xiàn)的。最重要的是,沒有移除任何功能。他的文章里提供了更多的細(xì)節(jié),如果想了解整個(gè)事情的來龍去脈,請(qǐng)閱讀原博文。
https://www.infoq.com/news/2026/03/datadog-go-binary-optimization/
聲明:本文為 InfoQ 翻譯,未經(jīng)許可禁止轉(zhuǎn)載。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.