【问题标题】:AppEngine Flexible instances constantly respawningAppEngine Flexible 实例不断重生
【发布时间】:2016-12-30 23:47:02
【问题描述】:

我正在使用 AppEngine flexible 部署一个 Go 应用程序。下面是我的 app.yaml。有时在我部署后它会稳定在 1 个实例(这是一个负载非常低的应用程序),但大多数时候它会不断重生超过 6 个实例。我的日志充满了显示正在创建的新实例的消息。此应用程序的负载几乎为零,为什么 AppEngine 灵活地不断销毁和重新生成实例?

显示不断重生的日志:

app.yaml

runtime: go
api_version: go1
env: flex

handlers:
- url: /.*
  script: _go_app

health_check:
  enable_health_check: True
  check_interval_sec: 10
  timeout_sec: 4
  unhealthy_threshold: 2
  healthy_threshold: 2

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 10
  cool_down_period_sec: 120 # default value
  cpu_utilization:
    target_utilization: 0.5

【问题讨论】:

  • 如果您向任何一个实例的 url '/_ah/health' 发送 get 请求会发生什么?
  • 我的健康检查端点返回了 200 'ok'。
  • 这可能是平台的问题。我们应该首先排除实例实际上是不健康的。重生通常是由失败或无响应的健康检查引起的。根据您的设置,一个实例只需 20 秒无响应(2 次运行状况检查)就可能导致重生(3 秒是安全的)。您的健康检查日志/_ah/health 是否显示间隔超过 30 秒的任何故障或响应?这个重生问题的时间表是什么?您的应用程序实例的 CPU 和内存使用情况如何? Hello World go flex 应用程序会这样做吗?
  • nginx.health_check 日志显示没有失败的健康检查。这通常发生在新部署之后,但几个小时后就会停止。几个小时内不断有实例重生,然后最终稳定在 2 个实例。我还没有使用 Hello World golang flex 应用程序进行测试。
  • 我尝试了 timeout_sec、unhealthy_threshold 和 cool_down_period_sec 变量的各种设置,结果都一样。重要的实例重生了几个小时,然后最终稳定下来。

标签: google-app-engine google-cloud-platform google-managed-vm app-engine-flexible


【解决方案1】:

问题出在我的健康检查功能上。它最初看起来像这样:

func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
    return
}

然后我在关于如何管理实例的文档中发现了这句话:

您可以编写自己的自定义健康检查代码。它应该使用 HTTP 状态代码 200 回复 /_ah/health 请求。响应必须包含消息正文,但是正文的值被忽略(可以为空)。

所以我改了健康检查功能,写了一个简单的“ok”作为响应:

func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("ok"))
    return
}

实例现在根据我的自动缩放设置运行!重生没了

我显然应该仔细阅读文档,但运行状况检查日志中的问题指示为零。所有的健康检查看起来都通过了。希望这些信息对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2013-10-12
    • 2013-08-08
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多