大家好,我是站长polarisxu。看到Uber今天如何使用Go,我感到很惊讶。让我与你分享。01Uber如何使用GoUber在数百万个CPU内核上运行着数以千计的Go后端服务。因此,对CPU瓶颈有一个详细而准确的把握,对Uber来说至关重要。这不仅是为了减少服务延迟,也是为了提高计算机运行效率。Uber的规模需要对代码和微观结构的影响有深刻的理解。02CustomGoCompiler其实说customGocompiler有点不准确。主要基于以上的规模和需求,虽然Go内置了Profiler,但是这个CPUProfiler在基于Linux的系统上有严重的局限性(可能这个问题在其他操作系统上也存在,但是Uber使用的是Linux,其他机器还没有已测试验证),而内置的Profiler缺少许多掌握CPU瓶颈所需的细节。基于这些问题,Uberfork了一个github.com/golang/go代码,并在其上构建了一个自定义的GoProfiler,以更好地满足Uber的需求和Uber的业务运营规模。具体来说,Uber通过将丰富的硬件性能监控功能集成到其中,增强了Go的默认pprof分析器。这提供了几个关键的好处:能够获得更准确和精确的Go程序配置文件;能够监控各种CPU事件,例如缓存未命中、套接字间(NUMA)通信、CPU分支预测错误等;能够以非常高的采样率(高达10微秒)监控Go程序;所以,Uber定制的“Go编译器”实际上只是一个增强的Profiler。注意Profiler的使用不需要改变,也就是说对外的接口、使用的工具、分析都没有改变(比如栈属性、调用图、火焰图等),但更多的是数据已添加。Profiler的增强版,Uber称之为pprof++,是一种带有硬件性能计数器的解决方案。具体添加了哪些CPU事件,Uber给出了一张图,里面公开了一些最常见的事件。关于这些事件和pprof++的更多详细使用信息,请参考:https://eng.uber.com/pprof-go-profiler/。Uberfork的Go仓库地址:https://github.com/uber-research/go。03看到这条新闻,惊叹Uber对Go的使用和研究之深。也证明Go被大公司大规模使用,我看好Go的未来。不知道Uber开发的pprof++有没有和GoTeam沟通过,尝试整合进Go官方仓库。毕竟既然是开源的,如果能在官网中使用,就能让更多的人受益。当然,由于目前只支持Linux系统,可能不适合集成。至少,不要指望Go出现分裂!
