Uber 使用 Go 的規(guī)模這么大?!都自己定制的 Go 編譯器了
大家好,我是站長 polarisxu。
今天看到 Uber 使用 Go 的情況,挺吃驚的,給大家分享下情況。
01 Uber 使用 Go 的情況
Uber 有數(shù)千個后端服務(wù)是使用 Go 實現(xiàn)的,它們運行在數(shù)百萬個 CPU 內(nèi)核上。因此,對于 Uber 來說,詳細(xì)準(zhǔn)確掌握 CPU 瓶頸至關(guān)重要。這不僅為了減少服務(wù)延遲,同時也能提高計算機(jī)運行效率。Uber 這個量級的規(guī)模,要求對代碼和微觀結(jié)構(gòu)的影響有深入的了解。
02 定制 Go 編譯器
其實說定制 Go 編譯器有點不準(zhǔn)確。主要是基于以上規(guī)模和要求,雖然 Go 內(nèi)置了 Profiler,但這個 CPU Profiler 在基于 Linux 的系統(tǒng)上有嚴(yán)重的限制(也許在其他操作系統(tǒng)也有此問題,但 Uber 使用的是 Linux,其他機(jī)器并沒有測試驗證),同時內(nèi)置的 Profiler 缺少掌握 CPU 瓶頸所需要的許多細(xì)節(jié)。
基于這些問題,Uber fork 了一份 github.com/golang/go 代碼,在其上建立一個定制的 Go Profiler,以便更符合 Uber 的需求和 Uber 的商業(yè)運營規(guī)模。
具體來說,Uber 通過將豐富的硬件性能監(jiān)視特性集成到 Go 的缺省 pprof 分析器中來增強(qiáng)它。這提供了幾個關(guān)鍵好處:
能夠獲得更準(zhǔn)確和精確的 Go 程序分析文件(profiles);
監(jiān)控各種 CPU 事件的能力,比如緩存丟失、套接字間(NUMA)通信、 CPU 分支錯誤預(yù)測等等;
能夠以非常高的采樣頻率(最高可達(dá) 10 微秒)監(jiān)控 Go 程序;
所以,Uber 定制的「Go 編譯器」其實只是增強(qiáng)了 Profiler。注意,對 Profiler 的使用并不需要改變,也就是說,對外的接口、使用的工具和分析都沒有變(比如堆棧屬性、調(diào)用圖和火焰圖等),只是增加了更多的數(shù)據(jù)。
增強(qiáng)版的 Profiler,Uber 稱之為 pprof++,這是帶有硬件性能計數(shù)器的解決方案。
具體增加了哪些 CPU 事件,Uber 給了一張圖,公開了最常見的一些事件。
關(guān)于這些事件的使用,以及 pprof++ 的更詳細(xì)信息可以參考:https://eng.uber.com/pprof-go-profiler/。
Uber fork 的 Go 倉庫地址:https://github.com/uber-research/go。
03 感想
看到這個消息,驚嘆 Uber 對 Go 的使用和研究之深,也證明了 Go 被大公司的規(guī)模使用,看好 Go 的前途。
不知道 Uber 開發(fā)的 pprof++,有沒有和 Go Team 溝通,嘗試合入 Go 官方倉庫,畢竟既然開源出來了,如果能夠在官方中使用,可以讓更多人收益。當(dāng)然,因為目前只支持 Linux 系統(tǒng),可能不太適合合入。至少,不希望 Go 出現(xiàn)分裂!