当前位置: 首页 > 知识库问答 >
问题:

应用引擎(python)如何跨请求管理内存(超过软私有内存限制)

曾飞雨
2023-03-14

我遇到偶尔超过软私有内存限制错误在各种各样的请求处理程序中的应用程序引擎。我明白这个错误意味着实例使用的内存超过了分配的数量,以及这是如何导致实例关闭的。

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

  • 一个F2实例以256 MB开始
  • 当它启动时,它加载我的应用程序代码-比方说30 MB
  • 当它处理请求时,它有226 MB可用
    • 只要该请求不超过226 MB(误差幅度),该请求完成w/o错误
    • 如果它确实超过226 MB的余量,实例完成请求,记录超过软私有内存限制的错误,然后终止-现在回到步骤1

    这就是我假设它将如何工作,但是考虑到我偶尔会在相当广泛的请求处理程序集中看到这个错误,我现在不太确定。我的问题是:

    a)第4步是否发生?

    什么会导致它不发生?还是不完全发生?如何在请求之间发生内存泄漏?

    c) 模块级变量中的存储是否会导致内存使用泄漏?(我不是故意这样使用模块级变量)

    D)我可以使用什么工具/技术来获得更多的数据?例如,在进入请求处理程序时测量内存使用情况?

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

    [edit]额外信息:我的应用程序被配置为线程安全:假。如果这与答案有关,请说明是什么。我打算很快改成threadSafe: true

    [编辑]澄清:这个问题是关于gae在内存管理方面的预期行为。因此,尽管像“callgc”这样的建议。collect()'很可能是相关问题的部分解决方案,它们不能完全回答这个问题。直到我理解了gae的预期行为,使用gc。collect()对我来说就像伏都教编程一样。

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

共有3个答案

韦睿
2023-03-14

看看这个问题

单于飞鸣
2023-03-14

第4点是一个无效的假设,Python的垃圾收集器不容易返回内存,Python的程序占用了内存,但直到垃圾收集器有通行证才使用。在此期间,如果其他一些请求需要更多的内存-新的可能会被分配,在第一个请求的内存之上。如果你想强制Python垃圾回收,你可以使用这里提到的gc.collect()

姜鸿畴
2023-03-14

与任何其他标准Python解释器相比,AppEngine的Python解释器在内存管理方面没有什么特别之处。因此,特别是,“每个请求”不会发生任何特殊情况,例如假设的步骤4。相反,只要任何对象的引用计数减少到零,Python解释器就会回收该内存(modulegc只是用来处理垃圾循环——当一堆对象由于没有可访问的外部引用而相互引用,所以它们的引用计数永远不会降到零时)。

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

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

至于(d),为了获得更多的数据(我想你实际上是指获得更多的内存),你唯一能做的就是为你需要内存的模块配置一个更大的instance_class

为了使用更少的内存,有许多技术——这些技术与应用引擎无关,与Python有关,特别是,与您非常特定的代码及其非常特定的需求有关。

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

 类似资料:
  • 我们有一个可怕的经验与gae围棋。当我们的应用程序是一个免费的,我们从来没有超过软私有内存限制的问题。我们抢了定额,因此决定付款。我们每天的预算定为3美元。付费服务激活后,我们可以再次使用该网站,超额配额消失了。几个小时后,我们得到了这个超软私有内存限制,除了这个,再也看不到任何东西了。我试图清除数据存储中的一些大数据,禁用内置插件,但仍然没有运气。 我在代码中做了一些测试,以确定故障来自何处。删

  • 我正在获取一个GZip LXML文件,并试图将产品条目写入数据库模型。以前,我有本地内存问题,这是通过SO(问题)的帮助解决的。现在我得到了一切工作和部署它,然而在服务器上我得到以下错误: 现在我尝试了所有我知道的方法来减少内存使用,目前正在使用下面的代码。gzip文件约为7MB,而解压缩文件约为80MB。本地代码运行良好。我试着将其作为HTTP请求和Cron作业运行,但没有什么不同。现在我想知道

  • 我们在谷歌应用引擎(GAE)上有一个长期运行的服务。然而,过了一会儿,我们开始得到图像中的错误。代码没有变化。我不明白为什么我们会有以前没有的问题。 2020-01-05 08:31:32.704UTC-8在总共服务0个请求后,超过了2048 MB的软内存限制(2068 MB)。考虑在app.yaml.中设置一个更大的实例类 2020-01-05 08:31:32.705UTC-8此请求导致为应用

  • 我目前有一个在Google App Engine标准环境中运行的应用程序,其中包括一个大型天气数据数据库和一个生成数据图的前端endpoint。该数据库位于Google云数据存储中,Python Flask应用程序通过NDB库访问它。 我的问题如下:当我试图为跨越一周以上的天气数据生成图表(数据每5分钟存储一次)时,我的应用程序超出了GAE的软私有内存限制并崩溃。然而,在我的每个WeatherDa

  • 我正在编写一个简单的服务,从多个来源获取数据,将其存储在一起,然后使用GoogleAPI客户端将其发送到GoogleSheet。Easy peasy很好用,数据没有那么大。 问题是,在构建api服务(即

  • 在python上的GoogleAppEngine中,我遇到了以下错误:在服务了总共2个请求后,超过了128 MB的软私有内存限制,达到了157 MB。我尝试使用以下命令来解决这个问题。上下文=ndb。获取上下文()和上下文。设置缓存策略(False)。我把这个方法放在appengine\u配置中。py,也在应该处理请求的处理程序中。我想知道是否还有其他地方可以放置这个命令,或者我是否应该总共使用一