一年多前发布的Golang 1.20支持 Profile Guided Optimizations (PGO),此后在 Go 1.21 中得到了改进,Go二进制文件的执行速度提高了 2~7%,这要归功于其他编译器也采用的这种优化方法。Cloudflare 的工程师本周发布了一篇博文,称赞 Go 的 PGO 支持以及因此节省的 CPU 资源。
编译器的PGO支持非常好,前提是有足够多的样本作为配置文件反馈给编译器,这样编译器就能对代码进行适当的优化。编译器可以根据收集到的配置文件/反馈做出更明智的优化,但与更容易应用的编译器优化相比,这确实需要额外的步骤。就 Golang 的 PGO 而言,某些代码库的改进幅度可高达 14%。
Cloudflare 拥有一些基于 Go 的服务,这些服务依赖于全球成千上万的 CPU 核心,因此他们最近开始探索 Golang 的 PGO 对其基础架构的影响。结果如下
这表明,在发布之后,我们使用的内核比发布之前少了约 97 个,减少了约 3.5%。这似乎与上游文档中给出的 2% 到 14% 之间的数字相符。我们可以感受到的的第二个数字是一周内不同天同一时间的使用率。发布前 7 天的平均使用率为 3067.83 个内核,而发布后 7 天的平均使用率为 2996.78 个内核,节省了 71 个 CPU。虽然比不上我们节省的 97 个 CPU,但也相当可观了!这似乎证明了 PGO 的好处--在完全不改变代码的情况下,我们成功地为自己节省了几台服务器的 CPU 计算时间。
考虑到当今的服务器成本以及总拥有成本(包括能源和冷却成本),节省几台服务器的 CPU 时间意义重大,这是以最少的投资实现的效率提升。今后,他们还将探索更多的剖析,通过 BOLT 或 LTO 优化和其他调整进一步优化。
更多详情请访问Cloudflare 博客。