Google App Engine "Handling signal: term" 每次
Google App Engine "Handling signal: term" everytime
我遇到了 google 应用引擎的问题。喜欢这个 post : 63392824
我的 Flask 应用程序是由 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 监控上看到的那样:
此信号由 App Engine 代理发送,通常在您的应用空闲以重新创建实例时发送。这是一个通用例程,旨在以最有效的方式分配共享资源。
您经常看到它很可能意味着您的应用程序正在泄漏内存,代理会在达到限制并重新创建时终止底层实例。这是 Java 个应用的常见问题。
分配的内存取决于标准中的 instance class。
在 Flex 中,您通过 app.yaml 分配资源。您可以在 App Engine Dashboard 或 Cloud Monitoring -> Metrics Explorer 中观察资源使用情况。
在搜索了多个奇怪的解决方案后,我找到了一些让它起作用的方法。
第一件事:直接在 Google App Engine 网络界面上的日志比在 gutils 命令中的日志多。可以在此处找到内存不足错误消息。
第二件事:实例在非调用时间后自动停止。基本上,如果不是 POST / GET 请求是在 idle_timeout 内发出的,实例将被停止。但是,如果像我一样,您的实例正在处理长期任务,则该实例将停止并且您的任务将被不公平地停止。
所以我们的想法是发出错误的 GET 请求来保持您的实例存活。
类似的东西(也许你需要调整 url):
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调用的。 :(
我遇到了 google 应用引擎的问题。喜欢这个 post : 63392824
我的 Flask 应用程序是由 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 监控上看到的那样:
此信号由 App Engine 代理发送,通常在您的应用空闲以重新创建实例时发送。这是一个通用例程,旨在以最有效的方式分配共享资源。
您经常看到它很可能意味着您的应用程序正在泄漏内存,代理会在达到限制并重新创建时终止底层实例。这是 Java 个应用的常见问题。
分配的内存取决于标准中的 instance class。 在 Flex 中,您通过 app.yaml 分配资源。您可以在 App Engine Dashboard 或 Cloud Monitoring -> Metrics Explorer 中观察资源使用情况。
在搜索了多个奇怪的解决方案后,我找到了一些让它起作用的方法。
第一件事:直接在 Google App Engine 网络界面上的日志比在 gutils 命令中的日志多。可以在此处找到内存不足错误消息。
第二件事:实例在非调用时间后自动停止。基本上,如果不是 POST / GET 请求是在 idle_timeout 内发出的,实例将被停止。但是,如果像我一样,您的实例正在处理长期任务,则该实例将停止并且您的任务将被不公平地停止。
所以我们的想法是发出错误的 GET 请求来保持您的实例存活。
类似的东西(也许你需要调整 url):
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调用的。 :(