每周性能技巧 #98:测量也有投资回报率
本节阅读量:本文翻译自 Abseil 官网的 Performance Tip of the Week #98: Measurement has an ROI。
原文发布于 2025 年 8 月 23 日,作者 Chris Kennelly,更新于 2025 年 10 月 3 日。
有效测量优化项目,是优化生命周期的重要组成部分。如果忽略了很大的正向或负向外部性,我们可能会在选择下一步行动和未来项目时做出错误决定。不过,追求准确性的过程也需要和“更好测量本身的投入产出比”取得平衡。本篇讨论如何判断什么时候值得投入更多时间测量一个项目,什么时候应该继续前进。
把大方向测对
选择测量策略时,我们希望先把大方向测对。我们要找的是:哪些差异会改变项目决策?这个项目到底应该回滚,因为它其实没有帮助、复杂度不值得;还是应该加倍投入,在已有成功的方向上继续做下去?
花一点额外精力,让测量结果出现 2 倍差异,可能有非常高的投资回报率:多花的测量时间,通常比从零发现、开发并落地另一个同等规模的优化要便宜得多。反过来,如果为了一个小得多的优化,把测量成本翻倍,只是为了继续细化结果,这种投入产出比就很差,因为新增精度会淹没在更大影响的噪声里。
我们很容易盯着页面上已有的数字,却忽略页面之外的数字。相比榨出第 7 位有效精度,更重要的是不要漏掉会改变结论的大型正向或负向外部性。
有效数字
优化结果是定量的,这很容易让人相信它们比实际情况更精确、更准确。对许多技术来说,我们只能测到 1 位或 2 位有效数字。
借助 Google-Wide Profiling 这样的工具,我们可以把 Google fleet 周期中 TCMalloc 所占比例表示成一个有 17 位小数的双精度浮点数。但写出这么多位,并不意味着这个数字真的拥有那样的精度。在单台服务器上让 TCMalloc 多花几毫秒,就可能改变这个数字的某些位。整体趋势是稳定的,但日与日之间的总量仍然存在标准差。
如果某个二阶效应相对于这种波动幅度很小,它可能会完全消失在噪声中。
聚合更多天数可以提供更多样本,但如果真实效应很小,持续更久的纵向研究可能会受到环境中无关变化的混杂因素影响。我们可能得到了更精确的测量,但环境变化会让准确性下降,抵消新增精度带来的收益。
精度与准确性
我们要避免把精度误认为准确性,反过来也一样。类似地,长时间分析可能被混杂因素阻碍;一个精心控制的实验,也可能给出看似高精度、但并不准确的结果。
许多负载测试会反复重放流量,并比较修改版配置与基线配置的性能。这些重复运行可以带来很大的样本量,从而得到低标准差估计,并让人产生结果准确的信念,而这种信念可能是错的。从设计上说,负载测试就是生产环境的简化,因此它可能省略了大规模部署中会遇到的某些工作负载类型、平台或环境特性。
即便使用生产 A/B 实验这类工具,通过在完整多样的工作负载上测试来帮助获得准确结果,我们仍然必须处理该技术的细节:
- 样本必须有代表性。例如,单个数据中心中的 A/B 测试,遇到的工作负载子集会不同于整个 fleet。
- 控制组和实验组必须彼此充分隔离。
- 实验设置需要避开统计陷阱。
如果我们确实能换来准确性上的真实收益,那么花时间处理这些因素是合理的:大规模数据局部性和竞争效应可能很难通过其他方式测量。对于没有这些外部性的小改动,我们可能花费大量精力做测量,却没有得到更好的测量。
通过聚合提高统计功效
小改动通过把工作拆成可管理、聚焦的块来提升敏捷性,这有助于测试、调试和评审。但它也会让测量叙事变复杂,因为需要追踪的片段更多了。
不要让测量的尾巴摇动优化这条狗:我们不必为了测量而强行合并无关优化,或者完全放弃这些优化。另一种选择是追踪短时间内一系列优化的聚合收益。
- 当我们迭代优化 TCMalloc 的 fast path 时,可以跟踪整体趋势以及相对于基线的性能影响。每个单独改动则可以通过检查汇编或微基准来评估。
- 在 SwissMap 迁移期间,可以跟踪关联容器成本的整体趋势。鉴于早期部署已经展现出压倒性的性能结果,每个单独改动主要可以按正确性评估,只有少数迁移改动需要保留细致的基准测试。
即便我们采用“聚合相似改动”的总体策略,也可能仍然想把权衡更重的优化单独拆出来看。某个改动如果会制造微妙边界情况或长期技术债,只有当它带来足够大的优化时才值得。如果最后没有兑现收益,我们可能更愿意回滚它,改去寻找更简单的方案。
平衡复杂与简单
追求更高准确性可能会诱使我们采用更复杂的方法。一个更容易实现、但能捕捉项目大部分影响和回退信号的方法,可以让我们把更多时间花在真正的优化、寻找外部性上,并且最终同样准确。
- 重要的是,不要把简单测量误解为不完整测量。目标是避免不必要的精度,而不是漏掉重大影响,例如对其他系统的传递成本,或不同资源维度之间的转移。
能够捕捉小效应的复杂方法,可能会把注意力吸引到它自己的细节上,导致我们忽略已经漏掉的更大影响。即使我们明确且诚实地尝试量化所有东西,人也更容易关注页面上的文字,而不是页面上缺失的文字。
- 虽然我们可能捕捉到更多与性能相关的现象,但额外考虑的因素也会引入新的误差来源。把多个数据源 join 到一起很诱人;但如果不熟悉它们各自的怪癖,最终可能得到意外甚至错误的结果。
- 简单意味着可解释。“这个性能优化只在澳大利亚工作时间有效”可能因为昼夜效应而完全正确,但如果测量方法把关键前提隐含起来,就更难立刻看出它和因果解释之间的联系。
当我们考虑为项目测量加入额外因素时,应该尝试估计每个因素相对于其他因素提供的有效数字有多大贡献。如果一个信号贡献 1% +/- 0.1pp,它会压过另一个贡献 0.01% +/- 0.001pp 的项。
结语
选择测量策略时,我们希望在精度、准确性和投入之间取得平衡。准确的测量可以帮助我们继续追求有成果的相邻优化方向,但也应该留意:什么时候增加投入只会带来越来越小的回报。