python - App Engine(python)如何跨请求管理内存(超出软私有(private)内存限制)

标签 python google-app-engine memory google-app-engine-python

我在 App Engine 的各种请求处理程序中偶尔遇到 Exceeded soft private memory limit 错误。我了解此错误意味着实例使用的 RAM 已超过分配的数量,以及这如何导致实例关闭。

我想了解错误的可能原因,首先,我想了解 App Engine python 实例应如何管理内存。我的基本假设是:

  1. F2 实例以 256 MB 开头
  2. 启动时,它会加载我的应用程序代码 - 比如说 30 MB
  3. 当它处理一个请求时,它有 226 MB 可用空间
    • 只要该请求不超过 226 MB(+ 误差幅度),该请求就会完成且没有错误
    • 如果确实超过 226 MB + 余量,实例将完成请求,记录“超出软私有(private)内存限制”错误,然后终止 - 现在返回步骤 1
  4. 当该请求返回时,它使用的所有内存都将被释放 - 即。未使用的 RAM 回到 226 MB
  5. 对传递给实例的每个请求无限期地重复步骤 3-4

这就是我假设它会起作用的方式,但考虑到我偶尔在相当范围的请求处理程序中看到这个错误,我现在不太确定。我的问题是:

a) 第 4 步会发生吗?

b) 什么可能导致它不发生?还是不完全发生?例如请求之间的内存泄漏是如何发生的?

c) 存储在模块级变量中会导致内存使用泄漏吗? (我并没有故意以这种方式使用模块级变量)

d) 我可以使用哪些工具/技术来获取更多数据?例如。测量请求处理程序入口处的内存使用情况?

在回答/评论中,请尽可能链接到 gae 文档。

[编辑] 额外信息:我的应用程序配置为 threadsafe: false。如果这对答案有影响,请说明它是什么。我计划尽快更改为 threadsafe: true

[edit] 说明:这个问题是关于内存管理的 gae 的预期行为。因此,虽然像“调用 gc.collect()”这样的建议很可能是相关问题的部分解决方案,但它们并没有完全回答这个问题。直到我理解 gae 的预期行为时,使用 gc.collect() 对我来说就像巫毒编程。

最后:如果我把这一切都弄反了,那么我提前道歉 - 我真的找不到很多有用的信息,所以我主要是猜测..

最佳答案

与任何其他标准 Python 解释器相比,App Engine 的 Python 解释器在内存管理方面没有任何特别之处。因此,特别是,“每个请求”不会发生任何特殊情况,例如您假设的第 4 步。相反,只要任何对象的引用计数减少到零,Python 解释器就会回收该内存(模块 gc 只是用来处理垃圾 cycles —— 当一堆对象永远不会将它们的引用计数降为零时,因为它们相互引用,即使没有可访问的外部引用)。

因此,如果您使用任何全局变量,内存很容易“在请求之间”“泄漏”(实际上,尽管从技术上讲这不是泄漏)——所述变量将在处理程序类及其(例如)get 方法——即您的观点 (c),尽管您说您没有这样做。

一旦你将你的模块声明为线程安全,一个实例可能会同时处理多个请求(直到你在中设置为max_concurrent_requests模块的 .yaml 配置文件的 automatic_scaling 部分;默认值为 8)。因此,您的实例的 RAM 将需要是每个请求所需内存的倍数。

至于 (d),为了“获取更多数据”(我猜你实际上是指获取更多 RAM),你唯一能做的就是为你的内存需求配置一个更大的 instance_class模块。

使用更少的 RAM,有许多技术 -- 与 App Engine 无关,与 Python 相关,特别是与您的特定代码及其相关的所有技术非常具体的需求。

我能想到的一个特定于 GAE 的问题是 ndb 的缓存已被报告泄漏——参见 https://code.google.com/p/googleappengine/issues/detail?id=9610 ;该线程还建议解决方法,例如关闭 ndb 缓存或移动到旧的 db (它没有缓存并且没有泄漏)。如果您正在使用 ndb 并且没有关闭它的缓存,那可能是您观察到的“内存泄漏”问题的根本原因。

关于python - App Engine(python)如何跨请求管理内存(超出软私有(private)内存限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981118/

相关文章:

PHP 内存耗尽 (json_decode)

html - 如何使用 lxml 根据变量列表解析 HTML 表?

python - 在yarn-cluster模式下运行python Spark作业

Python.el 错误处理了我在文档字符串上的 M-q 缩进

php - 从 AppEngine 中的 Laravel PHP 连接时出现 SQL 错误 'No such file or directory'

google-app-engine - 玩! 2.0 和谷歌应用引擎

c++ - 指向 char* 值的指针中的问题

网络抓取时的 R 内存管理

python - 在 Py3k 中,我如何让信号处理程序阻止信号的默认操作?

java - Objectify 中的多态性 : "id cannot be 0" in the SaveException