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