《Apache Dubbo微服务开发从入门到精通》——服务发现与负载均衡——三、 负载均衡机制(4) https://developer.aliyun.com/article/1224430
11) 原理介绍
HeuristicSmoothingFlowControl
• 相关指标
。 alpha
alpha为可接受的延时的上升幅度,默认为0.3。
。 minLatency
在一个时间窗口内的最小的Latency值。
。 noLoadLatency
noLoadLatency是单纯处理任务的延时,不包括排队时间。这是服务端机器的固有属性,但是并不是一成不变的。在HeuristicSmoothingFlowControl算法中,我们根据机器CPU的使用率来确定机器当前的noLoadLatency。当机器的CPU使用率较低时,我们认为minLatency便是noLoadLatency。当CPU使用率适中时,我们平滑的用minLatency来更新noLoadLatency的值。当CPU使用率较高时,noLoadLatency的值不再改变。
。 maxQPS
一个时间窗口周期内的QPS的最大值。
。 avgLatency
一个时间窗口周期内的Latency的平均值,单位为毫秒。
。 maxConcurrency
计算得到的当前服务提供端的最大并发值。
• 算法实现
当服务端收到一个请求时,首先判断CPU的使用率是否超过50%。如果没有超过50%,则接受这个请求进行处理。如果超过50%,说明当前的负载较高,便从HeuristicSmoothingFlowControl算法中获得当前的maxConcurrency值。如果当前正在处理的请求数量超过了maxConcurrency,则拒绝该请求。
AutoConcurrencyLimier
• 相关指标
。 MaxExploreRatio
默认设置为0.3。
。 MinExploreRatio
默认设置为0.06。
。 SampleWindowSizeMs
采样窗口的时长。默认为1000毫秒。
。 MinSampleCount
采样窗口的最小请求数量。默认为40。
。 MaxSampleCount
采样窗口的最大请求数量。默认为500。
。 emaFactor
平滑处理参数。默认为0.1。
。 exploreRatio
探索率。初始设置为MaxExploreRatio。
若avgLatency<=noLoadLatency*(1.0+MinExploreRatio)或者qps>=maxQPS*(1.0 + MinExploreRatio)
则exploreRatio=min(MaxExploreRatio,exploreRatio+0.02)
否则exploreRatio=max(MinExploreRatio,exploreRatio-0.02)
。 maxQPS
窗口周期内QPS的最大值。
。 noLoadLatency
。 halfSampleIntervalMs
半采样区间。默认为25000毫秒。
。 resetLatencyUs
下一次重置所有值的时间戳,这里的重置包括窗口内值和noLoadLatency。单位是微秒。初始为0。
。 remeasureStartUs
下一次重置窗口的开始时间。
。 startSampleTimeUs
开始采样的时间。单位为微秒。
。 sampleCount
当前采样窗口内请求的数量。
。 totalSampleUs
采样窗口内所有请求的latency的和。单位为微秒。
。 totalReqCount
采样窗口时间内所有请求的数量和。注意区别sampleCount。
。 samplingTimeUs
采样当前请求的时间戳。单位为微秒。
。 latency
当前请求的latency。
。 qps
在该时间窗口内的qps值。
。 avgLatency
窗口内的平均latency。
。 maxConcurrency
上一个窗口计算得到当前周期的最大并发值。
。 nextMaxConcurrency
当前窗口计算出的下一个周期的最大并发值。
Little's Law
当服务处于稳定状态时:concurrency=latency*qps。这是自适应限流理论的基础。
当请求没有导致机器超载时,latency基本稳定,qps和concurrency处于线性关系。
当短时间内请求数量过多,导致服务超载的时候,concurrency会和latency一起上升,qps则会趋于稳定。
• 算法实现
AutoConcurrencyLimier的算法使用过程和HeuristicSmoothingFlowControl类似。
实现与HeuristicSmoothingFlowControl的最大区别是AutoConcurrencyLimier是基于窗口的。每当窗口内积累了一定量的采样数据时,才利用窗口内的数据来更新得到maxConcurrency。
其次,利用exploreRatio来对剩余的容量进行探索。
另外,每隔一段时间都会自动缩小max_concurrency并持续一段时间,以处理noLoadLatency上涨的情况。因为估计noLoadLatency时必须先让服务处于低负载的状态,因此对maxConcurrency的缩小是难以避免的。
由于max_concurrency