【问题标题】:Why would GAE not distribute the load to the other available instances?为什么 GAE 不会将负载分配给其他可用实例?
【发布时间】:2020-01-26 17:58:17
【问题描述】:

首先,这是我的 app.yaml:

runtime: nodejs10
env: standard
instance_class: F1
handlers:
  - url: /.*
    script: auto
automatic_scaling:
  min_instances: 1
  max_instances: 20
inbound_services:
  - warmup

我正在为此使用 Apache Benchmark:

ab -c30 -n100000 "${URL}"

我在 GAE 控制台中注意到的是,我有 8 个可用实例,但只有 3 个实例承担了 99% 的工作。其余的要么不提供请求,要么只提供很小的一部分。

知道这里可能存在什么问题吗?

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    我建议在“app.yaml”文件中使用“max_concurrent_requests” 元素,因为该元素是自动扩展实例在调度程序生成新实例之前可以接受的并发请求数(请记住,最大限制为 80)。

    此外,您还可以设置 “max_pending_latency”,指定 App Engine 在启动其他实例处理请求之前应允许请求在待处理队列中等待的最长时间,从而减少待处理延迟。 如果你达到了限制,这将是一个扩大规模的信号,所以实例的数量会增加。

    【讨论】:

    • 在我看来,我有很多可用的实例来完成这项工作,所以我真的不需要在我的情况下生成更多实例。对于最大挂起延迟,我可以补充一点,我正在长时间运行这个负载测试:15-30 分钟,所以我认为有足够的时间来扩大规模。实际上,它确实扩大了流量,只是流量没有以某种方式正确分配。那些额外的 5 个实例仅在 15-30 分钟内处理
    【解决方案2】:

    负载不均匀分布在正在运行的实例中的事实是正常的,并且是实际需要的,只要仍在处理请求的实例数量足以以令人满意的性能水平处理当前负载水平 - 这允许其他实例空闲足够长的时间以自动关闭(由于不活动)。

    这是用于自动和基本调度的动态实例管理逻辑的一部分。

    【讨论】:

    • 嗯,我真的认为处理 99% 的 3 个实例跟不上负载。对于 30 个并发请求,我的理解是每个实例一次可以处理 1 个请求(F1 -> 1 cpu)。因此,其他实例似乎还有很多工作要做。如果我将并发请求实例化为 50 或 100,此观察结果也不会改变。
    • 尝试将并发请求设置为 1(这就是强制您的应用一次只处理 1 个请求,而不是单个 cpu 的原因)。还要注意您的请求延迟/响应时间(这是运行实例处理负载能力的最明显指标)
    • 是的,你对一次 1 个请求是完全正确的,我应该使用 max_concurrent_requests。不知何故,我实际上今天再也没有遇到过这个问题,我还没有重新部署,所以我不确定发生了什么变化。如果我无法重现,我将重试并关闭它。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多