每次都使用Google App Engine“处理信号:术语”

时间:2020-09-07 08:11:43

标签: google-app-engine flask term

我遇到了Google App引擎问题。就像这篇文章一样:63392824

我的烧瓶应用程序是由POST请求触发的,可能在一个小时内完成了一些工作。

一段时间后,我看到我的新请求被停止,没有错误。这是我在日志中看到的:

[..some logs without errors..] 
    2020-09-07 07:24:09 app-engine-name[20200903t092926]  [2020-09-07 07:24:08 +0000] [10] [INFO] Handling signal: term
[...]
    2020-09-07 07:24:10 app-engine-name[20200903t092926]  [2020-09-07 07:24:10 +0000] [21] [INFO] Worker exiting (pid: 21)
    2020-09-07 07:24:10 app-engine-name[20200903t092926]  [2020-09-07 07:24:10 +0000] [25] [INFO] Worker exiting (pid: 25)

我该如何对此进行调试并找到该术语信号的原因?

提前感谢您的时间!

编辑

我尝试将我的应用升级到F4_1G(2G内存限制),但是问题出在钢上。 内存似乎不是问题,就像我在Googe监控中看到的那样: Google App Engine Memory Monitoring

2 个答案:

答案 0 :(得分:0)

通常在您的应用空闲以重新创建实例时,此信号由App Engine代理发送。这是一种通用例程,旨在以最有效的方式分配共享资源。

您经常看到它的事实很可能意味着您的应用程序正在泄漏内存,并且代理程序在达到极限时会杀死基础实例并重新创建它。这是Java应用程序的常见问题。

已分配的内存取决于Standard中的instance class。 在Flex中,您可以通过app.yaml分配资源。您可以在App Engine仪表板或Cloud Monitoring-> Metrics Explorer中观察资源使用情况。

答案 1 :(得分:0)

在搜索了多种奇怪的解决方案后,我找到了一些让它发挥作用的方法。

第一件事:直接在 Google App Engine 网络界面上的日志比在 gutils 命令中的日志多。可以在此处找到内存不足错误消息。

第二件事:实例在一些非调用时间后自动停止。基本上,如果在 idle_timeout 内未发出 POST / GET 请求,则实例将停止。但是,如果像我一样,您的实例正在处理长时间的任务,该实例将被停止并且您的任务将被不公平地停止。

所以我们的想法是发出错误的 GET 请求以保持您的实例处于活动状态。

类似的东西(也许你必须修改网址):

import os, requests

requests.get( 'https://{}-dot-{}-dot-{}.ew.r.appspot.com/keep-alive'.format( os.environ['GAE_VERSION'],os.environ['GAE_SERVICE'], os.environ['GOOGLE_CLOUD_PROJECT'] ) )

API 函数不必很复杂:

@api_blueprint.route('/keep-alive', methods=['GET'])
def keep_me_alive():
    resp = make_response("I'm alive ! o/") 
    resp.headers['Access-Control-Allow-Origin'] = '*'
    return resp

通过 GAE_VERSION 参数的集成,您将确保保持正确的一个实例。

在您的任务期间定期调用此请求行,并在此结束时停止这样做,让您的实例在此之后停止。

编辑:如果您按版本只有一个实例,则此方法有效。并且在标准环境中无法使用实例 ID 进行调用。 :(

相关问题