"快一点"是工程学中最难操作的指令之一, 直到有数据告诉你时间的确切走向。
在高流量的电子商务平台上,大约两年半的时间里,我们把平台的闲置时间减少了大约30%,同时在交易高峰期保持99.9%的营业时间——包括当年最高的交通日,当时错误的幅度最小,而错误的代价最高.
没有一个来自一个戏剧性的重写。
它来自一个可重复的过程,一贯适用。
从拒绝猜测开始 当有些东西觉得慢时的本能是优化你假设的慢事——通常是你上次碰过的东西,或者在快速阅读上看起来效率低下的东西.
这种本能往往是错误的,以至于非常危险,因为并不是瓶颈的"优化"代码会增加零延迟利益的复杂性和风险,它会消耗你应该花在实际瓶颈上的时间.
固定是无聊而不可谈判的: 剖面:首先,在类似于生产流量模式的环境中,在写出单一优化之前.
真正的瓶颈往往不光彩——隐藏在ORM抽象后的一个N+1查询,同步调用本可以并行的下游服务,在技术上存在的缓存,但在真正重要的热道上缺失.
在30%实际来自粗略的地方,胜利分为三类:查询优化。
单高杠杆类.
几个代码路径正在使数据库连续往返,彼此之间没有数据依赖性——典型的N+1模式是随着时间推移而逐渐引入的,其特性没有个别令人震惊,集体昂贵。
剪接这些,在少数情况下, 使特定的热病读数非正常化, 产生了我们测得的最大的 暂时性改进。
目标明确的重构绩效关键路径。
不重写 —— 专门对配置标记的路径重新设定范围 。
这一点与速度一样重要:只重构数据的理由意味着团队可以解释为什么每个变化都存在,而不是继承一个大型的diff,其性能原理必须建立在信念上.
基础设施一级调试.
一些暂时性完全不在应用代码中.
对实际观测到的负载进行正确缩放的EC2实例和Lambda配置,而不是从业务的更早阶段继承的默认,关闭了查询优化不会触及的缺口.
容易跳过的部分:在生产中测量, 安全地在笔记本电脑上的描述器 告诉你你的笔记本电脑。
生产流量的形状—— 货币模式,缓存温暖,数据skew—— 这在中转中确实很难伪造.
在不危及平台的情况下弥合这一差距的方法是逐步推出,每个步骤都有真正的衡量标准: p95/p99的学科之所以重要,具体是因为平均值隐藏了您最差用户的经验,而在电子商务中,在高峰交易中最差用户不成比例的是在准确的负载最高的时候检查出来的用户——也就是说,你最不能承受错误的时刻.
自动化作为一种耐久性和可靠性战略 除了耐久性工作之外,我们还建立了内部自动化,将人工数据处理削减了80%。
这不是一个直接的即时数字,但与此相关:人工过程是既延迟又出错的隐藏来源,而您去掉的每一个人工步骤都少了一个地方,一个时间压力下的人在错误最昂贵的高流量期间引入错误.
可靠性和业绩工作最终比人们所期望的更加相辅相成。
在你触摸到任何东西之前 整个工作概况都是什么 每一个没有从这里开始的优化 要么没有任何可衡量 要么使其他事情更糟。
优化数据标记,而不是看起来无效