我有一个具有c个服务器的系统,每个服务器只能处理单个并发请求,并且没有内部队列。服务器位于负载均衡器之后,负载均衡器包含无限队列。不限数量的客户端平均每秒向负载均衡提供c*0.8个请求。换句话说,我们使用c线性增加提供的负载,以保持每台服务器的负载恒定。一旦请求到达服务器,平均需要一秒钟来处理。客户端观察到的平均请求时间如何随c变化?
选项A是平均等待时间迅速减少,随着c的增加逐渐接近一秒(换句话说,排队时间接近于零)。选项B是恒定的。选项C是线性改进,而D是延迟的线性降低。直观地说,您认为延迟将遵循哪条曲线?
稍微分解一下这个问题将有助于找出哪一个是正确的答案。首先是名字。在排队论的术语中,这是一个M/M/c排队系统:泊松到达过程、指数分布的客户服务时间和c个后端服务器。在电信业务工程中,它指的是Erlang的延迟系统(或者,因为术语有趣,叫M/M/n)。我们可以使用排队论的一个经典结果来分析这个系统:Erlang的C公式E2,n(A),该公式根据服务器数量(n又称为c)和提供的流量A计算进入队列(而不是立即处理)的客户请求的概率。有关详细信息,请参阅电信业务工程手册的第194页。以下是曲线的基本形状(使用我们相同的参数):
沿着蓝线走到饱和点的一半,在2.5 RPS提供的负载下,看看概率是如何在13%左右的。现在请看饱和点的一半处的紫色线条,即5 RPS。只有3.6%。因此,在负载减半的情况下,5台服务器的系统无需排队即可处理87%的流量,在双倍负载和双倍服务器的情况下,我们无需排队即可处理96.4%的流量。这意味着只有3.6%的人看到任何额外的延迟。
事实证明,这一改善实际上是渐近接近1的。推特民意调查的正确答案是A。
使用平均数来衡量潜伏期是有争议的(尽管或许它不应该如此)。为了避免这种争议,我们需要知道百分位数是否以同样的速度改善。在封闭的形式下做这件事有点复杂,但这个系统超级简单,所以我们可以用蒙特卡罗模拟把它们画出来。结果如下所示:
这完全是个好消息。中位数(P50)很好地遵循平均线,高百分位数(第99和99.9个百分位数)形状相似。没有隐藏的问题。
对于云计算和服务经济来说,这也是个好消息。使用较大的c,我们可以在相同利用率的情况下获得更好的延迟,或者在相同延迟的情况下获得更好的利用率,所有这些都是在相同的每台服务器吞吐量下实现的。这不仅仅对大型服务来说是个好消息,因为大部分好处都发生在相对较小的c。随着c的增加,几乎没有什么与规模和分布式系统相关的问题会变得更容易。这是其中之一。
有一些合理的后续问题。对于我们随意选择的0.8,结果稳健吗?是的,它们是1。对于典型的服务,泊松到达和指数服务时间的M/M/c假设是否合理?我要说它们是合理的,尽管是错误的。指数服务时间尤其错误:现实的服务往往更像是对数正态分布。这可能无关紧要。有关这一点的更多信息,下次再说吧。
更新:Dan Ports用一个迷人的Twitter帖子回应了我的帖子,该帖子指向了SoCC';14的尾部延迟的硬件、操作系统和应用程序级来源,该帖子研究了这种影响在野外的情况。
在一定程度上。一旦平均到达率超过系统完成请求的能力,队列就会无限制地增长,等待时间就会变得无限长。在我们的示例中,当请求负载超过c时就会发生这种情况。更一般地,要使此系统稳定,λ/cμ必须小于1,其中λ是平均到达率,μ是服务器处理请求所用的平均时间。