我遇到了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监控中看到的那样:
答案 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 进行调用。 :(