假期突发404!性能优化是时候要反思一下

原标题:假期突发404!性能优化是时候要反思一下
在假期某个夜黑风高的晚上 , 商家正在直播间如火如荼的做着直播 , 突然间屏幕卡顿 , 随后屏幕上出现大大的“404” , 紧接着大量的客诉、告警扑面而来 。
好在有赞教育的技术团队响应及时 , 再经过很短时间的问题分析后 , 迅速的恢复了系统 , 保障了商家直播顺利进行 。 这故障到底是怎么产生的呢?经排查是因为在流量高峰时 , 系统在性能、可用性方面存在不足导致的 。 那当时你们是怎么处理的呢?
接下来 , 我会重点从性能优化这块出发 , 先普及下性能优化的基本概念 , 然后再简述下常用的性能优化手段 , 最后给出这个故障我们当时的应对之道 。
一、什么是性能优化
正如熵增定律描述的那样 , 在一个孤立的系统里 , 如果没有外力做工 , 其总混乱度(即熵)会不断增大 , 直至系统彻底变得无序 。 在软件服务领域亦是如此:从应用系统上线那一刻开始 , 随着用户量的增加、业务功能的持续迭代 , 系统会面临各种不同程度的挑战 , 如果不及时采取优化措施 , 我们会发现诸多问题 , 比如:系统怎么越来越慢了 , 流量一高系统就卡顿、甚至宕机等等 。 可以说 , 性能优化是贯穿在整个软件生命周期之中的 。
1、性能衡量指标
在衡量系统性能基线时 , 一般会从接口“响应时间”和“并发能力”两个维度考虑 。
1)响应时间(RT)
所谓响应时间 , 是指完成某一功能所需要的时间 , 一般可以通过“平均响应时间”、“百分位数”等指标来考量 。
平均响应时间(AVG)【假期突发404!性能优化是时候要反思一下】该指标反映的是接口的平均处理能力 , 计算方式是:将接口请求所有的响应时间叠加起来 , 然后除以总的请求次数 。 举个例子:接口A总共发起了8次请求 , 其中 , 有1次3ms , 3次5ms , 4次6ms , 那么此接口的平均响应时间就是(1*3+3*5+4*6)/8=5.25ms 。
百分位数(TopPercentile)一种统计学术语 , 反映的是超过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辆 。 假设上级部门想提升这块路段的车流量 , 我们该怎么办?

假期突发404!性能优化是时候要反思一下
文章图片
图1-1单车道限速50km/h
第一种方式 , 可以增加车道数(空间维度):将道路从单车道变为多车道 , 比如增加到6车道 , 那么 , 在1h内 , 从A点出发到达B点的汽车数可提量到60辆 , 见图1-2 。

假期突发404!性能优化是时候要反思一下
文章图片
图1-2六车道限速50km/h
第二种方式 , 道路提速(时间维度):将道路限速从50km/h提升到100km/h , 那么 , 在1h内 , 从A点出发到达B点的汽车数可提量到20辆 , 见图1-3 。

假期突发404!性能优化是时候要反思一下