1、性能指标
cpu使用率
tps qps
rt
2、思路
监控发现问题,
cpu变化,访问量变化,耗时变化
排查,锁定问题
例如db耗时高导致服务端耗时高,内部处理死循环
制定目标
产出解决方案
查看效果,不断调优
3、方案
扩容
短时间快速解决,简单粗暴
串行---》并行
充分利用机器资源,提高吞吐量,以空间换时间,但需要考虑并行数大小
同步--〉异步
不是强依赖的链路,可以转成异步处理,主线程先同步返回结果,缩短服务耗时
但是要关注异步处理限流,流控,晓峰填谷
多次单比--》合并处理
减少多次调用的网络耗时
远端--〉近端,内存
减少网络耗时
但是要保证近端,内存中数据的更新机制
DB优化
事务最小化‘
索引
案例
比如活动最优计算,平台类型的活动
活动1
商户人群规则
用户人群规则
活动使用次数规则
活动2
商户人群规则
用户人群规则
活动使用次数规则
活动3
商户人群规则
用户人群规则
活动使用次数规则
业务特点:
活动个数多
从几百个活动中选出最优活动,运算量大。
活动规则种类多
人群规则,商户规则
难以直接锁定某一个活动
请求量大
优化的过程
1、串行---》并行
活动1 活动1..N
活动2. 活动2..N
活动3-----------〉活动3..N
。。。
活动n. 活动m.N
RT减少了几十ms,cpu增加了10%,空间换时间
‘线程数不能无限扩张,反而增加线程来回切换的使用成本
随着活动数的不断扩大,流量的不断增加,又到达了一个瓶颈
2、倒排索引
并行跑的活动个数还是太多,能否提前过滤一部分活动?减少线程数?
规则分析结论:区分度高的规则能否提前过滤,例如商户人群规则,门店规则
特征提取 门店类 门店人群1--》活动1
门店人群1--》活动2
规则前置---》解析活动规则--〉生成人群缓存--》建立活动索引 商户类
索引构建 用户类
区分度高的规则提前过滤,过滤后在并行验证活动的剩余规则
线程数下降很多,cpu下降了10%
外部依赖优化
调用人群量级很高,并且大部分的情况都是人群验证不通过,如何减少人群接口的调用?远程--》近端,内存。
引入boomfilter‘
本质上不拢过滤器是一种数据结构,告诉你“某样东西一定不存在或者可能存在”。他的原理将数据通过多次hash设置到数据中,标记该数据是否存在,如果计算出数组中值为0,那么肯定不存在,如果为1那么可能存在,一次请求能命中的活动很少,大部分情况验证不存在。
将人群的数据放到本地的boomfilter中,直接过滤。
规则中心规则运算优化
业务描述
一个活动都会有自己的规则,例如 人群规则,领取规则等多个条件
规则模型
规则组1: 条件1 且 条件2
或
规则组2: 条件1 且 条件2
或
规则组3 : 条件1 且 条件2
从上至下依次执行
业务特点:
通过率高的规则组优先执行
通过率低的条件优先执行
规则大部分还是人群
优化过程
1、并行+合并处理
并行调用规则中,然后规则中心合并执行
2、动态调整规则的优先级
规则中心---》将运行时数据打印摘要实时同步到调度决策中心
离线计算好规则的优先级,在同步到规则中心。这样规则中心就可以动态的执行
采集运行中实时的规则通过率,计算各个条件通过率的优先级,计算完后推送到各个机器上,按照优先级的顺序执行;耗时下将20%,cpu下降10%