我Exceeded soft private memory limit
在应用引擎中的各种请求处理程序中偶尔遇到错误。我了解此错误意味着实例使用的 RAM 已超过分配的数量,以及这如何导致实例关闭。
我想了解错误的可能原因,首先,我想了解应用引擎 python 实例如何管理内存。我的基本假设是:
- F2 实例以 256 MB 开始
- 当它启动时,它会加载我的应用程序代码 - 比如说 30 MB
- 当它处理一个请求时,它有 226 MB 可用
- 只要该请求不超过 226 MB(+ 误差范围),该请求就可以完成而没有错误
- 如果确实超过 226 MB + 边距,则实例完成请求,记录“超出软私有内存限制”错误,然后终止 - 现在返回步骤 1
- 当该请求返回时,它使用的任何内存都会被释放 - 即。未使用的 RAM 回到 226 MB
- 无限期地对传递给实例的每个请求重复步骤 3-4
这就是我认为它会起作用的方式,但考虑到我偶尔会在相当广泛的请求处理程序中看到这个错误,我现在不太确定。我的问题是:
a) 步骤#4 发生了吗?
b) 什么可能导致它不发生?还是不完全发生?例如,请求之间的内存泄漏如何?
c) 存储在模块级变量中会导致内存使用泄漏吗?(我不是故意以这种方式使用模块级变量)
d) 我可以使用哪些工具/技术来获取更多数据?例如,在请求处理程序入口处测量内存使用情况?
在答案/评论中,请尽可能链接到 gae 文档。
[编辑] 额外信息:我的应用程序配置为threadsafe: false
. 如果这对答案有影响,请说明它是什么。我打算threadsafe: true
很快换。
[编辑]澄清:这个问题是关于 gae 对内存管理的预期行为。因此,虽然像“呼叫gc.collect()
”这样的建议很可能是相关问题的部分解决方案,但它们并没有完全回答这个问题。直到我了解 gae 的行为方式之前,使用gc.collect()
对我来说就像是巫毒编程。
最后:如果我把这一切都搞砸了,那么我提前道歉——我真的找不到太多有用的信息,所以我主要是在猜测..