在假期某个夜黑风高的晚上,商家正在直播间如火如荼的做着直播,突然间屏幕卡顿,随后屏幕上出现大大的“404”,紧接着大量的客诉、告警扑面而来。好在技术团队响应及时,再经过很短时间的问题分析后,迅速的恢复了系统,保障了商家直播顺利进行。这故障到底是怎么产生的呢?经排查是因为在流量高峰时,系统在性能、可用性方面存在不足导致的。那当时你们是怎么处理的呢?接下来,我会重点从性能优化这块出发,先普及下性能优化的基本概念,然后再简述下常用的性能优化手段,最后给出这个故障我们当时的应对之道。
一、什么是性能优化
正如熵增定律描述的那样,在一个孤立的系统里,如果没有外力做工,其总混乱度(即熵)会不断增大,直至系统彻底变得无序。在软件服务领域亦是如此:从应用系统上线那一刻开始,随着用户量的增加、业务功能的持续迭代,系统会面临各种不同程度的挑战,如果不及时采取优化措施,我们会发现诸多问题,比如:系统怎么越来越慢了,流量一高系统就卡顿、甚至宕机等等。可以说,性能优化是贯穿在整个软件生命周期之中的。
1、性能衡量指标
在衡量系统性能基线时,一般会从接口“响应时间”和“并发能力”两个维度考虑。
1)响应时间(RT)
所谓响应时间,是指完成某一功能(事务)所需要的时间,一般可以通过“平均响应时间”、“百分位数”等指标来考量。
平均响应时间(AVG)
该指标反映的是接口的平均处理能力,计算方式是:将接口请求所有的响应时间叠加起来,然后除以总的请求次数。举个例子:接口A总共发起了8次请求,其中,有1次3ms,3次5ms,4次6ms,那么此接口的平均响应时间就是 (1 * 3 + 3 * 5 + 4 * 6) / 8 = 5.25ms 。
百分位数(Top Percentile)
一种统计学术语,反映的是超过n%的请求都在m时间内返回,一般用TPn=m来描述,比如:TP99=5,表示超过99%的请求都能在5ms内返回。它的计算方式是:将接口的响应时间按从小到大的顺序进行排列,取特定百分位的耗时,即为该接口的百分位数。举个例子:接口A总共发起了100次请求,响应时间依次是1、2、3、...、100,那么,TP95就是95ms。
一般而言,百分位数更能反映接口的整体响应情况,因为在高并发场景中,常常会出现一些长尾请求,如果采用平均响应时间去衡量,由于长尾请求会被大量低RT平均掉(此时很多用户的请求已经很慢了),进而无法及时感知真实业务状况。举个例子:接口A有100次请求,其中97次1ms,3次100ms,平均响应时间为 (1 * 97 + 3 * 100) / 100 = 3.97ms,此时3.97ms并不能真实反映接口的整体性能,因为其中97次请求RT才1ms。
2)并发能力
并发能力一般用QPS或TPS来衡量。QPS指的是每秒请求数,TPS是指每秒事务数。一般在做性能评估时,TPS用的比较多。
2 、性能优化本质
在算法领域,评价一个算法的效率如何,主要会看它的时间复杂度和空间复杂度情况。同理,如果将“响应时间”比作时间维度的话,“并发能力”可类比为空间维度。那么,在做性能优化时,本质上也是从“优化时间”、“优化空间”、“时空互换(用时间换空间或用空间换时间)”三个方向去思考,然后在空间、时间上不停地做取舍。
举一个生活中的例子来说明下。图1-1是一条长度为5km的道路,道路的限速是50km/h,同时,规定在任何时刻,车道上有且仅有一辆汽车。那么,在1h内,从A点出发到达B点的汽车最多只有10辆。假设上级部门想提升这块路段的车流量,我们该怎么办?
第一种方式,可以增加车道数(空间维度):将道路从单车道变为多车道,比如增加到6车道,那么,在1h内,从A点出发到达B点的汽车数可提量到60辆,见图:
第二种方式,道路提速(时间维度):将道路限速从50km/h提升到100km/h,那么,在1h内,从A点出发到达B点的汽车数可提量到20辆,见图:
二、怎么做性能优化
1、系统性思考性能优化点
我们先来看下性能优化的落地过程,性能优化是由人来执行,然后服务于产品的,人和产品共同参与性能优化的落地,见图:
从人维度出发,性能优化是属于技术团队的,技术团队包括开发、测试和运维,其中,运维负责提供一些监控数据,测试负责提供一些压测数据,开发基于压测、监控数据,明确具体的优化点以及优化手段;从产品维度出发,性能优化是业务功能的一部分,是为了满足某些业务场景。于是,在做性能优化时,一般会考虑以下几点:
(1)本次性能优化的业务场景是什么,有哪些场景需要优化;
(2)这些场景的运维监控数据、测试压测数据是什么,要优化哪里;
(3)这些数据里面反映的系统瓶颈在哪里,如何去优化;
(4)重复(2)、(3)过程,直至满足优化目标。
结合性能优化的本质,整个优化过程其实就是:先从业务需求角度出发,思考待优化场景是否值得投入,比如:一个任务每次需要跑半小时,从技术层面,可以做下优化,但结合业务情况却发现,此任务的执行频次是每周一次,如果优化此场景需要耗费较大人力,那么,这个投入就是不值得的;然后再从技术实现角度出发,不停地去思考怎么优化时间、怎么优化空间、怎么牺牲空间换时间、怎么牺牲时间换空间等问题。总之,我们在做性能优化时,需要以一个更全面的视角去看待它,避免进入头痛医头脚痛医脚的误区。
2、常见性能优化方式
在实际业务场景中,一个外部请求进入系统后,会先后经历多个软硬件节点,所有节点的处理时间加起来才是用户请求的处理时间,如果其中任意一个节点性能有问题,系统整体的性能就会上不去。而且,由于节点自身差异性,其性能提升的方法也会不一样,但总体概括起来,可以分为两大类:提升单个请求处理效率;并行处理多个请求。
1)提升单个请求处理效率