性能优化
执行路径
性能优化的核心路径是先创建指标,再围绕指标进行优化——即 先量化问题,再围绕问题采取各类措施去降低影响范围。
具体的执行路径由如下四个步骤执行:
- 性能指标:量化性能问题,可以从整个系统、关键路径两个方向来设计。
- 摸底分析:对性能指标数据进行分析,了解当前的系统/服务/功能性能处在业内什么水平,对标竞品。
- 策略调整:产品逻辑以现有技术无法落地需转换思路或者目前的技术方案\架构存在缺陷需要改造升级等。
- 专项治理:指标拆分,专项治理。本质是围绕 渐进增强、优雅降级 提升性能品质。
工作权重
性能优化工作最忌讳的是认为*解决某个问题或突破某个瓶颈*就能够解决性能问题,一开始就盲目地投入治理、优化工作。按照性能优化执行路径权重金字塔,金字塔的最底层(最首要的工作)是制定完善的性能指标体系,并完成线上服务/功能的摸底分析工作。
在取得数据之前就把事情理论化是一个严重的错误。不理智的人扭曲事实来适应理论,而不是改变理论来适应事实。
*——夏洛克・福尔摩斯「波西米亚丑闻」/柯南・道尔著/引用自《性能之巅:洞悉系统、企业与云计算》第二章「方法」 *
『不谋全局者,不足谋一域』。
——《寤言二·迁都建藩议》 陈澹然
性能指标
性能优化最重要的工作是建立完善的性能指标体系,即先将性能问题量化。量化性能问题的过程其实也是在对系统执行流程进行的一次深度分析;如果,性能问题无法量化则需要考虑技术实现是否存在缺陷或研发工程师对这块逻辑的实现设计了解是否缺乏深度。
如何建立性能指标?通常情况会性能指标拆分为 系统指标 和 关键路径指标 两大类:
- 系统指标 会以**定时任务的形式**上报指标数据,比如常见的有当前时刻内存占用、CPU利用率、FPS 等等。
- 关键路径指标 则指**满足某些条件或触发某些行为**产生的指标数据,比如用户首次登入系统到可交互耗时(即TTI)、点击按钮后得到响应的耗时等等。
前文提到,量化性能问题的过程其实也是一次性能分析的过程。但是指标的目标值可能通过线下自测或QA测试反馈得来,但并不一定能反馈线上用户的真实情况。此时需要,根据产品特性和项目组成员讨论确定最合理的指标值。
摸底分析
指标除了参考业内标准指标或对齐竞对指标之外,我们还需要摸底分析线上用户数据的真实情况。
性能量化数据实时上报也很重要——这里就需要参考公司基建条件,选择合适的数据上报、分析平台。
摸底分析需要解决的问题是:在现有的产品诉求、技术架构实现上,我 们的服务/工具的性能瓶颈最差、平均、最佳处于什么样的分布。
规范指标内容并完成采集后,我们能拿到线上用户的真实数据。通过系统分析和数据可视化后,我们能大体了解线上用户面临的性能困境分布情况。这样,在遭遇用户投诉时,我们也知晓影响范围以不至于恐慌、无头绪。此外,在指标趋于稳定阶段时还可以引入监控报警体系,问题暴露赶在用户反馈问题前,及时止损。
策略调整
性能指标体系建设完成后,再针对线上用户进行摸底分析之后,可能会面临这样的困境——线上性能数据与性能指标差异过大,“匪夷所思”的差异。
这个时候则需要考虑两个问题:
- 产品逻辑是否合理
比如,产品需求是 iOS 应用中查看一个 2G 内存的三维模型,性能指标是三维模型渲染成功率。但是有部分 iOS 设备内存低于 2G,很明显受限于硬件条件,研发工程师无能为力。这时产品经理则需要考虑内存低于 2G 的 iOS 查看三维模型的策略,比如降低模型贴图质量——显示效果差但内存占用低。
- 技术方案/架构设计是否存在瓶颈
比如,某个客户端 App 展示类型的详情页希望能秒开(300ms内),但是技术方案又是通过 WebView
内嵌 Web 页面来渲染展示,很明显原生客户端渲染的方案更加容易达到目标。
做性能优化最担忧的是当项目已经上线或快交付阶段时才发现产品逻辑不合理、技术方案/架构设计存在缺陷,最终处在「高不成低不就」的状态——即继续提升性能,产品策略不合理/架构缺陷 不支持;不继续提升性能,产品质量、竞争力又不足。因此,性能指标建设 和 进行摸底分析 越早越好,且处在性能优化执行路径权重金字塔最底层,也是最重要的。
专项治理
时间就像海绵里的水,只要你愿意挤,总还是有的——鲁迅。
同样的,做性能优化也如同在挤海绵里的水——挤出百分之八十的水份还是很容易的,但是越往后出水难度越高且出水量越低。
再次强调性能优化工作需要站在全局的角度进行思考、统筹,忌讳的是一开始就投入精力来在某个细化领域内进行专项治理。稍有不慎,可能出现解决某个性能问题(提升的性能指标),但造成其他性能指标变得更差,甚至影响到原有的产品业务。
在保证 ①整体指标大盘稳定、②产品策略合理 且 ③技术架构无缺陷 的前提下,才可以以专项任务的形式治理局部性能问题。
定位性能瓶颈的位置可以尝试围绕 A/B 测试、控制变量法、局部灰度、精简Demo 演练 等方式进行,核心思路尽可能多地去除干扰项。
性能优化的本质是 渐进增强、优雅降级,追求完美的性能体验最终的结果也是“千人千面”式的——即根据终端条件、使用场景等用户画像条件提供不同的策略,包括技术和产品。