大家好,我是站长 polarisxu。
今天看到 Uber 使用 Go 的情况,挺吃惊的,给大家分享下情况。
01 Uber 使用 Go 的情况
Uber 有数千个后端服务是使用 Go 实现的,它们运行在数百万个 CPU 内核上。因此,对于 Uber 来说,详细@ H i s f \准确掌握 CPU 瓶颈至关重要。这不仅为了减少服务延迟,同时也能提高计算机运行效率。Uber 这个量级的规模,要求对代码和微观结构的影响有深入的了解。
02 定制 Go 编译器
其实说定制 Go 编5 & | y s i ! _ a译器有点不准确。主要是基于以上规模和要求,虽C L 9 _ w然 Go 内置了 Profiler,但这个 CPU Profiler 在基于 Linux 的系统上有严重的限制(也许在其他操作系统也有此问题,但 Uber 使用的是 Linux,其他机器并没有测试验证),同时内置的 Profiler 缺少掌握 CPU 瓶颈所需要的许多细节。
基于这些问题,Uber fork 了一份 github.com/golang/go 代码,在其上建立一个定制的 Go Profiler,以便更) N P h符合 Uber 的需求和 Uber 的商业运营规模。
具体来说,Uber 通过将丰富的硬件性能监视特性集成到 Go 的缺省 pprof 分析器中来增强它。这提供了几个关键好处:
能够获得更准确和精确的 Go 程序分析文件(profiles);! i q C ] s
监控各种 CPU 事件的能力,比C d r S C 9 u r 3如缓存丢失、套接字间(NUMA)通信、 CPU 分支错Z ^ 7 b h误预测等等;
能够以非常高的采样频率(最高可达 10 微秒)监控 Go 程序;
所以,Uber 定制的「Go 编译器」其实只是增强了 Profiler。注意,对 Profiler 的使用并不需要改变,也就是说,对外的@ f ^ k & \ t接口、使用的工具和分析都没有变% $ ^ y v j u h r(比如堆栈属性、调用图和火焰图等),只是增加了更多的数据。
增强版的 Profiler,Uber 称之为 pprof++,这是带有硬件性} ( – g能计数器的解决方案。
具体增加了哪些 CPU 事件,Uber 给了一张图,公开了最常见的一些事件。
关W 7 = G ^ M 5 e于这些事件的使用,0 { ; U以及 pprof+; = p x D M ? ++ 的更详细信息可以参考:https://eng.uber.com/pprof-go-profiler/。
Uber fork 的 Go 仓库地址:https://github.com/uber-research/go。
03 感[ & j D m } ,想
看到这个消息,惊叹 Uber 对 Go 的使[ ` 6 s用和研究之深,也证明了 Go 被大公司的规模使用,看好 Go 的前途。
不知道 Uber 开发的 pprof++,有没有和 Go Team 沟通,尝试合入 Go 官方仓库,毕竟既然开源出来了,如果能够在官方中使用,可以让更多人收益。当然,因为目前只支持 Linux 系统,可能不太适合合入。至少,不希望 Go 出现分裂!