Google App Engine 实例反复关闭和​​启动

Google App Engine instance shuts down and starts repeatedly

前提/你想达到的目标

我正在 Python 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, {}

TL;DR:是的。

提供的示例应用程序没有任何问题。预热路径已根据文档正确配置,并且 app.yaml 设置没问题。此外,这似乎不是内存不足的情况,因为您会在 App Engine UI.

中看到日志和监控图中反映的此类事件。

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