当没有流量时,为什么没有关闭空闲实例?

问题描述

几周前,即使流量接近零,我在App Engine上的应用程序也开始将闲置实例的数量增加到不合理的高水平。这当然会影响我的账单飞涨。

我的应用程序是简单的Node.js应用程序,提供了连接到我的Cloudsql数据库的GraphQL API。

为什么要启动所有这些空闲实例?

我的app.yaml

runtime: nodejs12
service: default

handlers:
  - url: /.*
    script: auto
    secure: always
    redirect_http_response_code: 301

automatic_scaling:
  max_idle_instances: 1

监视屏幕截图:

enter image description here

enter image description here

解决方法

这是非常奇怪的行为,根据documentation,它只能暂时超过max_idle_instances

注意:当负载峰值后恢复到正常水平时, 空闲实例的数量可以暂时超过您指定的数量 最大。但是,您支付的实例费用不会超过 您指定的最大数量。

一些可能的解决方案:

  1. 在控制台中确认实际的app.yaml配置与App Engine控制台中的配置相同。

  2. (暂时)将min_idle_instances设置为1,将max_idle_instances设置为2,然后重新部署应用程序。在扩展方面可能出了点问题,重新部署应用程序可以解决此问题。

  3. 请检查您的日志记录(过滤器应用程序引擎),以关闭空闲实例是否存在任何问题。

  4. 最后,您可以调整诸如max_pending_latency之类的设置。我见过人们构建应用程序需要2-3秒才能启动,而默认时间是30ms,然后才能启动另一个实例。

  5. post建议设置以下内容,您可以尝试以下方法:

    instance_class: F1
    automatic_scaling:
      max_idle_instances: 1  # default value
      min_pending_latency: automatic  # default value
      max_pending_latency: 30ms
    
  6. 切换到basic_scaling,让Google确定最佳缩放算法(最后选择)。看起来像这样:

    basic_scaling:
      max_instances: 5
      idle_timeout: 15m
    

解决方案当然也可以是2和4的组合。

,

24小时后更新:

我遵循@Nebulastic建议2和4,但没有任何区别。因此,我无奈地禁用了整个Google App Engine(App Engine>设置>禁用应用程序)并将其关闭了10分钟,并在监控仪表板中确认一切都消失了(抱歉,用户!)。

10分钟后,我再次启用了App Engine,它仅启动了1个实例。从那以后我一直在密切监视它,现在看起来(终于)很好。现在,重新启动后,它还遵循“最小”和“最大”空闲实例配置-@Nebulastic的建议。谢谢!

屏幕截图:

enter image description here

enter image description here

,

您是否检查过以确保没有一堆旧版本还在运行? https://console.cloud.google.com/appengine/versions

在“服务”下拉列表中检查每个服务