【问题标题】:Google App Engine instance shuts down and starts repeatedlyGoogle App Engine 实例关闭并重复启动
【发布时间】:2021-03-20 09:12:58
【问题描述】:

前提/你想要达到的目标

我正在 Google App Engine 标准环境中使用 Python Flask 创建一个 Web 应用程序,我想将 app.yaml 设置如下,以便一个实例始终运行。

[app.yaml]
runtime: python37

instance_class: F2

inbound_services:
- warmup

entrypoint: gunicorn -b :$PORT --workers 2 --threads 2 main:app

automatic_scaling:
  min_instances: 1
  max_instances: 2
  min_idle_instances: automatic
  max_idle_instances: automatic

发生了什么以及您要检查什么

如果您将其放置一段时间而无法访问并检查日志, 您可以看到实例反复关闭和​​启动,如下所示。 (通常每小时重复几次。)

/_ah/warmup
[INFO] Starting gunicorn 20.0.4
[INFO] Listening at: http://0.0.0.0:8081 (7)
[INFO] Using worker: threads
[INFO] Booting worker with pid: 15
[INFO] Booting worker with pid: 18
[INFO] Handling signal: term
[INFO] Worker exiting (pid: 15)
[INFO] Worker exiting (pid: 18)
[INFO] Shutting down: Master
/_ah/warmup
[INFO] Starting gunicorn 20.0.4
[INFO] Listening at: http://0.0.0.0:8081 (7)
[INFO] Using worker: threads
[INFO] Booting worker with pid: 15
[INFO] Booting worker with pid: 17

由于设置了 min_instances,设置一个预热请求并设置它。 您还可以从日志中看到应用程序正在处理。 由于它是通过预热请求立即启动的,因此结果是始终启动一个实例,但这样一来,实例关闭并重复启动而没有任何访问权限是正确的行为。是不是吗?

补充资料

以下示例应用用于提问。

[requirements.txt]
Flask==1.1.1
gunicorn
[main.py]
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

@app.route('/_ah/warmup')
def warmup():
    # Handle your warmup logic here, e.g. set up a database connection pool
    return '', 200, {}

【问题讨论】:

  • 您的实例正在被终止。可能是因为您的应用程序没有在端口 8080 上侦听。为什么要在端口 8081 上侦听?默认值为 8080。在您更改默认端口号的问题中,我看不到任何内容。你的日志有日期和时间吗?从Starting gunicorn 20.0.4到收到Handling signal: term的时间间隔是多少?
  • 您没有明确指定端口 8081。我只是将它写在 app.yaml 的入口点中,就像在 App Engine 文档中一样。顺便说一句,即使在这种状态下,您也始终可以访问 Web 应用程序。启动 gunicorn 20.0.4 和接收到处理信号之间的时间间隔:术语并不总是恒定的。它可以从几分钟到几十分钟,甚至几个小时。我想知道实例多次关闭和启动是否正确。
  • 你在哪里为warmup指定处理程序?
  • 你说它每小时关闭几次,所以听起来你的应用程序在某种程度上正在运行。我的猜测是您超出了内存限制,这会导致关机。尝试增加实例内存。
  • 预热处理程序由 main.py 中的 @app.route('/_ah /warmup') 指定,如 Google 文档中所述。 cloud.google.com/appengine/docs/standard/python3/…

标签: python google-app-engine flask google-cloud-platform gunicorn


【解决方案1】:

TL;DR:是的。

提供的示例应用程序没有任何问题。根据文档正确配置了预热路径,并且 app.yaml 设置正常。此外,这似乎不是内存不足的情况,因为您会在日志中看到此类事件以及 App Engine UI 中可见的监控图表。

请注意,App Engine 是一项托管服务,可根据应用程序指标(例如内存消耗等)使用各种启发式方法按需扩展。虽然 min_instances 设置确定实例应该始终运行,但有多种原因可能导致特定实例关闭。这里的关键点是,无论特定实例关闭或生成,app.yaml 中定义的设置都将受到尊重。请注意,这一事实反映在附加的日志中,始终有一个实例处于活动状态。总体而言,在这种托管环境中可以正常终止,并且不会影响您的应用程序可用性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多