计算CPU负载时使用滑动平均来降低CPU负载抖动带来的不稳定,关于滑动平均见参考资料
滑动平均就是取之前连续N次值的近似平均,N取值可以通过超参beta来决定当CPU负载大于指定值时触发降载保护机制时间窗口机制,用滑动窗口机制来记录之前时间窗口内的QPS和RT(response time)
滑动窗口使用5秒钟50个桶的方式,每个桶保存100ms时间内的请求,循环利用,最新的覆盖最老的计算maxQPS和minRT时需要过滤掉最新的时间没有用完的桶,防止此桶内只有极少数请求,并且RT处于低概率的极小值,所以计算maxQPS和minRT时按照上面的50个桶的参数只会算49个满足以下所有条件则拒绝该请求
当前CPU负载超过预设阈值,或者上次拒绝时间到现在不超过1秒(冷却期)。冷却期是为了不能让负载刚下来就马上增加压力导致立马又上去的来回抖动
averageFlying > max(1, QPS*minRT/1e3)
averageFlying = MovingAverage(flying)
在算MovingAverage(flying)的时候,超参beta默认取值为0.9,表示计算前十次的平均flying值
取flying值的时候,有三种做法:
请求增加后更新一次averageFlying,见图中橙色曲线请求结束后更新一次averageFlying,见图中绿色曲线请求增加后更新一次averageFlying,请求结束后更新一次averageFlying我们使用的是第二种,这样可以更好的防止抖动,如图:
QPS = maxPass * bucketsPerSecond
maxPass表示每个有效桶里的成功的requestsbucketsPerSecond表示每秒有多少个桶1e3表示1000毫秒,minRT单位也是毫秒,QPS*minRT/1e3得到的就是平均每个时间点有多少并发请求
https://github.com/tal-tech/go-zero
好未来技术
