GO PGO优化

2023-11-14 ⏳1.5分钟(0.6千字)

PGO在Go 1.21中已经可以在生产中使用了。据官方原文描述可以提升2%-7%的CPU效率。收益还是相当可观的,那我们就基于目前的项目做一个简单的尝试,看下最终的结果如何。

什么是PGO

PGO可以翻译为基于profile指导的优化,即根据生产环境的CPU使用情况(pprof文件)来优化编译效率,试图生成性能最佳的二进制文件。除了一些常见的优化方式,例如

大家也可以看下这个issue,PGO可以优化的一些列表。

测试PGO

尝试使用一个线上高频接口首页信息流去测试功能,该接口包括了足够多了io操作以及cpu操作。

goos: darwin
goarch: arm64
pkg: github.com/prattmic/markdown-pgo/load
         nopgo.txt  │           pgo2.txt            │
          sec/op    │   sec/op     vs base          │
Load-8   216.1µ ± 0%   215.4µ ± 0%  ~ (p=0.143 n=40)

效果并不明显,我们再测试下处理300000次请求,需要使用的cpu使用时间:

  pgo go tool pprof -top /tmp/cpu.pprof | grep "Total samples"
Duration: 89.50s, Total samples = 91.85s (102.62%)
  pgo go tool pprof -top /tmp/cpu-nopgo.pprof | grep "Total samples"
Duration: 93.66s, Total samples = 92.90s (99.18%)

大约节省1%的CPU时间

结论

整体测试下来有一定的优化程度,但是并没有达到官方的数值2%-7%,在io密集型项目中会更不明显。我们还是更加期待Go会持续的优化PGO,让这一特性能发光发亮。