理论基础
性能优化怎么做
性能优化不是一次性的工作,而是一种体系化的长期工作,有效的性能优化应当穿插在工作中的各个阶段,从抽象的角度来讲,总体来说可以分为以下几个维度:
制定性能优化基线
-
制定指标,先确定需要如何度量优化的效果,确定指标的口径,然后基于指标的口径从技术角度来统计数据,保证线下和线上都能看到对应的指标的变化。指标的制定需要科学可信,要保证指标的变化可以解释。
-
度量工具,定完指标之后,怎么把指标稳定的测出来是非常重要的,尤其是流畅度相关的指标,在线下测试时,设备的IO、网络稳定性、CPU 频率等都会对指标有干扰,因此需要保证这些变量的稳定性。线上指标采集时,要保证对采集指标不会对性能产生影响。
-
确定基线,当指标稳定后,需要基于指标制定合理的性能基线,作为长期的性能优化目标。
分层实施优化
- 问题分析,大致可以分为线上和线下 2 个方向。
- 线上分析,一种是正向分析,根据全链路的数据,确定“慢”或者“卡”在具体哪一个阶段,对各个阶段进行硬优化;还有一种是多维度的分析,找出最影响性能的维度,对问题聚类分析,例如在页面打开速度的指标中,有缓存的时候页面打开仍然慢,需要分析缓存命中率,然后针对性的提升缓存命中率。线上分析还有一种是看性能问题出现时对线上的用户影响有多大从而进行分级处理,比如在收集到一定数量的问题后,看是大量用户低频次问题,还是少量用户高频次问题。
-
线下分析,通查都是针对特定的可以稳定复现的常见,通过trace或者计时打点,找到耗时点进行特定的方式的优化,这类耗时一般分为单次耗时多和累计次数多,需要针对性进行降耗时或者降次数。比如说在页面打开耗时中,发现一次打开页面会有多次重复的 IPC,就可以对调用结果加缓存,减少 IPC 的次数。
-
确定优化目标和优化策略,经过线下分析之后,一般会列出很多的优化项,最理想情况下应该是把所有的优化都做了,但是通常可投入的时间都是有限的,甚至有一些优化效果是互相矛盾的。此时应该基于目标,结合实现成本、收益大小、影响范围、维护陈本等因素,挑出来性价比最高的可达成目标的优化策略。
-
优化效果回收,优化之后,在线下和线上都要进行数据回收,验证优化效果。有的时候,线下的优化效果明显,线上效果不明显,就需要对线上的数据进行多维度分析,确认优化是否真正解决了线上的问题。回收完数据后,可以在回到之前的步骤中,重复进行分析,直到达成目标。
构建防劣化机制
在研发的各个流程中都可以对防劣化做功。
- Code Review中,通过人或者 AI 工具对风险代码进行预警
- CI/CD建立准入标准,对集成代码前进行性能检测,满足性能要求才能准入。以及日常跑性能测试,出现问题及时预警。
- 发布阶段,对优化项进行灰度放量,当符合预期之后才可以进行继续扩量。
验证业务价值
性能问题除了要考虑要做什么,还要考虑不做什么。技术大部分时候都是为了业务服务的,做完性能优化后,如果有条件,可以通过 AB 实验的方式验证性能优化对业务指标的贡献,一方面可以体现出性能优化的价值,另一方面,也能为性能优化定一个度,性能做到什么程度可以不用做。