利用 Go 的 Profile Guided Optimization 免费回收 CPU

💡 原文英文,约1300词,阅读约需5分钟。
📝

内容提要

Golang 1.20引入了Profile Guided Optimization (PGO)来优化系统行为。Cloudflare的Observability团队使用PGO来降低CPU使用率并改善客户体验。他们从生产基础设施中收集了代表性的配置文件,并部署了新的PGO二进制文件,从而实现了显著的CPU节省。该过程包括编译非PGO二进制文件、收集CPU配置文件,并使用这些配置文件编译第二个二进制文件。团队在不更改代码的情况下实现了3.5%的CPU使用率减少,并节省了数台服务器的CPU时间。未来的工作包括自动化配置文件收集、优化部署流程和实施进一步的优化。Cloudflare正在美国和EMEA地区招聘。

🔎

延伸解读

PGO 的工作原理与优化手段

PGO 利用生产环境中的 CPU 配置文件来指导编译器优化生成的汇编代码。具体优化包括更积极地内联高频函数、调整分支预测以偏向常见分支,以及重新排列代码将热路径集中,减少 CPU 缓存交换。与编译器内置的启发式规则相比,生产配置文件能提供更准确的运行时行为信息,从而做出更有效的优化决策。

收集代表性配置文件的挑战与策略

由于全球数千台服务器的使用模式各异,选择哪些服务器进行性能分析至关重要。Cloudflare 的 Observability 团队选择从负载较重的 Tier 1 数据中心收集配置文件,因为这些数据中心的 wshim 服务瓶颈最明显。他们通过 Thanos 查询高 CPU 使用率的实例,并使用 pprof 接口拉取 30 秒的 CPU 配置文件,最后合并成一个代表性配置文件用于编译。

PGO 的实际效果与测量方法

部署 PGO 优化后的二进制文件后,团队通过两种方式评估 CPU 节省:一是比较部署前后立即的 CPU 使用量,显示减少了约 97 个核心(约 3.5%);二是比较同一时段不同日期的平均使用量,7 天平均节省了 71 个 CPU。尽管存在流量波动等混杂因素,但结果与上游文档中 2% 到 14% 的节省范围相符,且无需修改代码。

未来优化方向与自动化需求

初步结果证明了 PGO 的价值,但团队认为仍有改进空间。未来工作包括自动化配置文件收集(可能采用持续性能分析)、优化部署流程以处理“两步部署”(先部署非 PGO 二进制,再部署 PGO 二进制)、改进获取代表性样本的技术,以及探索 BOLT 或其他链接时优化(LTO)技术。这些步骤有望进一步降低 CPU 使用率。

❓

Q&A

什么是Profile Guided Optimization (PGO)?

PGO是一种优化技术,通过使用生产环境中的CPU配置文件来指导编译器进行优化,从而提高程序性能。

Cloudflare如何利用PGO降低CPU使用率?

Cloudflare的Observability团队通过收集生产环境中的代表性CPU配置文件,编译新的PGO二进制文件,从而实现了3.5%的CPU使用率减少。

使用PGO的流程是什么?

使用PGO的流程包括编译非PGO二进制文件、在生产环境中收集CPU配置文件,然后使用这些配置文件编译第二个PGO二进制文件。

PGO对CPU使用率的影响有多大?

通过使用PGO,Cloudflare实现了约3.5%的CPU使用率减少,节省了数台服务器的CPU时间。

Cloudflare未来在PGO方面有哪些计划?

Cloudflare计划自动化配置文件收集、优化部署流程,并实施进一步的优化。

PGO如何优化生成的汇编代码?

PGO通过分析CPU在执行程序时的行为,优化函数内联、分支预测和代码重排等,以提高执行效率。

🏷️

标签

➡️

继续阅读