由于内存限制(使用40MB),Google App Engine应用程序会被终止?

时间:2014-05-13 02:12:14

标签: google-app-engine google-cloud-datastore

我的GAE后端总是以40MB的内存使用率终止,并且日志说它使用了太多的内存。我不知道为什么因为我使用的B1 / B2应该有128 / 256MB。

以下是详细信息

我使用前端模块和后端(在python中)创建我的GAE应用程序。前端获取用户请求并发送到后端。后端是一个涉及谷歌云存储服务的图像处理应用程序。它需要很长时间才能完成并按预期消耗一些内存。后端模块运行很长时间(可能是5-10分钟)所以我将该函数作为后台线程启动,如文档中所示:

t = background_thread.BackgroundThread(target=f, args=["foo", "bar"])
t.start()

我的本​​地开发服务器上的一切正常。但是,在云上,每次线程即将完成时,它都会终止。记录说:

  

2014-05-12 18:45:11.826在处理此请求时,该过程即   处理此请求被发现使用了太多的内存而且是   终止。这很可能会导致一个新的过程被用于   下一个请求您的申请。如果您经常看到此消息,   您的应用程序中可能存在内存泄漏。

我搜索了很多,人们通常会收到另一条消息“达到软内存限制”的消息,但我只收到一条消息。我检查了我的内存使用情况报告,这个过程总是以40MB终止!但是我使用了B1和B2,它应该有128 / 256MB的限制。顺便说一下,我尝试了1-3个实例的手动和基本缩放。

即使很短的运行也会导致这个问题。我尝试处理20张图像(每张只有5-10kb)应该花费几十秒才能达到最大值,它仍然会被杀死40MB。我也发现当我的后端idel,它已经花费30 MB。我怀疑图像处理将花费数百MB。在我的本地机器上,图像处理通常只需几秒钟就可以完成......

我的猜测是:

由于我的函数作为一个线程运行而没有进一步的请求,谷歌认为后端是空闲的,不应该消耗这么大的内存。因此,gae会因为内存泄漏而导致死亡。 或者,谷歌限制线程只使用40MB内存。

顺便说一下,我没有启用我的账单。它会给我这样的限制吗?

任何人都可以帮我解决这个问题吗?非常感谢你。

Memory usage figure

1 个答案:

答案 0 :(得分:0)

在运行长作业时,后端实例存在类似问题。清除上下文缓存可以解决问题。 尝试清除上下文缓存:

context = ndb.get_context()
context.clear_cache()

检查出来:https://cloud.google.com/appengine/docs/python/ndb/cache#incontext