GAE 中的“软私有内存限制”是啥?

Posted

技术标签:

【中文标题】GAE 中的“软私有内存限制”是啥?【英文标题】:What is the "soft private memory limit" in GAE?GAE 中的“软私有内存限制”是什么? 【发布时间】:2012-03-09 01:12:07 【问题描述】:

我的应用程序的用户尝试使用我的应用程序将文件作为电子邮件附件发送。但是,这样做会引发以下我无法解读的异常

Exceeded soft private memory limit with 192.023 MB after servicing 
2762 requests total

While handling this request, the process that handled this request was
found to be using too much memory and was terminated. This is likely to
cause a new process to be used for the next request to your application.

If you see this message frequently, you may have a memory leak in 
your application.

什么是“软私有内存限制”以及可能导致此异常的原因是什么?

【问题讨论】:

看起来 GAE 对运行应用程序的进程可以使用的内存量施加了限制。您的应用程序超出了此限制(可能是通过尝试在缓冲区中保存一个非常大的附件?),因此系统对其采取了措施。我感到困惑的唯一部分是消息说进程已“终止”,那么这个异常是在哪个执行线程中引发的? @SteveJessop AFAIK,该进程被允许在被终止之前完成其最后一个请求。 【参考方案1】:

我假设您使用的是最低级别的前端或后端实例。 (F1 或 B1 类)两者都有 128 MB 的内存配额,所以你的应用很可能超过了这个配额限制。然而,这个配额似乎没有得到严格执行,而且谷歌对此有一些宽大处理(因此称为soft limit),我有几个 F1 应用程序实例在被 App Engine 终止之前几分钟消耗了大约 200MB 的内存。

尝试将您的实例类增加到具有 256MB 内存配额的下一个更高级别的类(F2 或 B2),并查看错误是否再次发生。此外,每次发送带附件的电子邮件时,请调查该错误是否可重现。因为您看到的可能是症状而非原因,并且您的应用程序中消耗大量内存的部分位于其他地方。

【讨论】:

我正在使用最低级别的实例 - 这是增加内存限制的好方法。我会尝试附加一些大的东西并选择更高的实例。 别忘了更新后端。在我看来,AppEngine 默认运行 B1。尝试: appcfg.py 后端。更新(另见:groups.google.com/forum/?fromgroups=#!topic/google-appengine/…) 对我来说,这听起来像是发生了一些内存泄漏,并且 GAE 的实例没有正确释放内存。 Ibrahim,您说(在对 OP 的评论中):AFAIK, the process was allowed to finish its last request before being terminated. – Ibrahim Arief Feb 17 '12 at 23:15 这是否意味着在这种情况下,电子邮件可能已成功发送?也许@user714852 可以回答? @TheRedPea 很可能,是的。 Google 未记录此行为。 (出于充分的理由,他们可能希望在任何给定时间更改它)这还取决于进程的繁重程度,如果需要很长时间才能完成,那么 GAE 可能会决定积极终止实例。【参考方案2】:

“软私有内存限制”是 App Engine 将阻止实例接收更多请求、等待任何未完成的请求并终止实例的内存限制。当您使用过多内存时,可以将其视为正常关闭。

偶尔达到软限制是可以的,因为您的所有请求都按应有的方式完成。但是,每次发生这种情况时,您的下一个请求可能会启动一个新实例,这可能会产生延迟影响。

【讨论】:

以上是关于GAE 中的“软私有内存限制”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

GAE Python 标准:超过硬内存限制,而 RSS 小两倍

写入云存储时 GAE 内存泄漏,我可以流式传输吗?

GAE:确保外部任务真正完成的首选方法是啥?

你用 Clojure 做 GAE 应用程序的方法是啥?

在 GAE、Java、JDO 等环境中,DAO 是啥?

GAE 可以限制我的 websocket 连接吗?