负载均衡系统的意外经济学
M/M/c 模型的行为可能超出你的预期。我有一个有 c 个服务器的系统,每个服务器只能处理单个并发请求,并且没有内部排队。服务器位于负载均衡器后,该负载均衡器包含一个无限队列。无限数量的客户端平均向负载均衡器提供 c * 0.8 的请求每秒。换句话说,我们以线性方式增加提供的负载和 c 来保持每台服务器的负载不变。一旦请求到达服务器,平均需要一秒钟来处理。客户端观察到的平均请求时间如何随 c 变化?选项 A 是,平均延迟迅速减少,随着 c 的增加渐近于一秒(换句话说,在队列中花费的时间接近零)。选项 B 是常数。选项 C 是线性改善,而选项 D 是延迟的线性恶化。你直观上认为延迟将遵循哪条曲线?我问了我的 Twitter 关注者同样的问题,得到了有趣的混合结果:稍微分解一下问题将有助于找出正确答案。首先,名称。在排队理论的术语中,这是一个 M/M/c 排队系统:泊松到达过程,指数分布的客户服务时间,以及 c 个后端服务器。在电信工程中,这是 Erlang 的延迟系统(或者,因为术语是有趣的,M/M/n)。我们可以使用排队理论的经典结果来分析这个系统:Erlang 的 C 公式 E 2,n (A),该公式计算根据服务器的数量(n,即 c)和提供的流量 A ,进入客户请求被排队(而不是被立即处理)的概率。有关详细信息,请参见《电信工程手册》第194页。这里是曲线的基本形状(使用相同的参数):沿着蓝线上升到饱和点的一半,在 2.5 rps 提供负载时,看到概率在 13% 左右。现在看看紫线,在饱和点的一半,5 rps。仅 3.6%。所以在一半负载时,5 台服务器的系统没有排队处理了 87% 的流量,当负载翻倍和服务器翻倍时,我们处理 96.4% 的流量而没有排队。这意味着只有 3.6% 的请求经历了额外的延迟。结果表明,这种改善确实渐近于 1。Twitter 投票的正确答案是 A。使用平均值来衡量延迟是有争议的(尽管也许不应该)。为了避免这种争议,我们需要知道百分位数是否以相同的速度变得更好。以封闭形式进行的计算有些复杂,但这个系统非常简单,所以我们可以使用蒙特卡洛模拟绘制它们。结果看起来是这样的:这完全是好消息。中位数(p50)很好地跟随平均线,高百分位数(99th 和 99.9th)具有类似的形状。没有隐藏的问题。这对云和服务经济学也是好消息。随着 c 的增大,我们在相同的利用率下获得更好的延迟,或者在相同的延迟下获得更好的利用率,所有这一切都在相同的每台服务器的吞吐量下。这对大型服务来说不是坏消息,因为大部分这种好处发生在相对适度的 c 下。有一些与规模和分布式系统相关的问题,在 c 增加时变得更容易。这是其中之一。还有一些合理的后续问题。我们的参数选择为 0.8 的结果是否稳健?是的,它们是 1。M/M/c 假设的泊松到达和指数服务时间对典型服务来说是否合理?我会说它们是合理的,尽管是错误的。特别是指数服务时间是特别错误的:现实中的服务往往更像对数正态。这可能无关紧要。之后会有更多的讨论。更新:Dan Ports 在我的讨论中回应了一个有趣的 Twitter 讨论,指出了 SoCC'14 中的《尾部延迟的故事:硬件、操作系统和应用程序级尾部延迟来源》,该文探讨了这个效应的真实情况。脚注 up to a point。只要平均到达率超过系统完成请求的能力,队列就会无限增长,延迟将趋向于无穷大。在我们的情况下,这发生在请求负载超过 c 时。更一般地,对于这个系统保持稳定,必须满足 λ/cμ < 1,其中 λ 是平均到达率,μ 是服务器处理请求所需的平均时间。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡