Google ndb 库中的内存泄漏

2024-01-04

我认为存在内存泄漏ndb图书馆,但我找不到在哪里。

有没有办法避免下面描述的问题?
您是否有更准确的测试想法来找出问题所在?


这就是我重现问题的方式:

我创建了一个包含 2 个文件的简约 Google App Engine 应用程序。
app.yaml:

application: myapplicationid
version: demo
runtime: python27
api_version: 1
threadsafe: yes


handlers:
- url: /.*
  script: main.APP

libraries:
- name: webapp2
  version: latest

main.py:

# -*- coding: utf-8 -*-
"""Memory leak demo."""
from google.appengine.ext import ndb
import webapp2


class DummyModel(ndb.Model):

    content = ndb.TextProperty()


class CreatePage(webapp2.RequestHandler):

    def get(self):
        value = str(102**100000)
        entities = (DummyModel(content=value) for _ in xrange(100))
        ndb.put_multi(entities)


class MainPage(webapp2.RequestHandler):

    def get(self):
        """Use of `query().iter()` was suggested here:
            https://code.google.com/p/googleappengine/issues/detail?id=9610
        Same result can be reproduced without decorator and a "classic"
            `query().fetch()`.
        """
        for _ in range(10):
            for entity in DummyModel.query().iter():
                pass # Do whatever you want
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello, World!')


APP = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/create', CreatePage),
])

我上传了该应用程序,名为/create once.
之后,每次调用/增加实例使用的内存。直到因错误而停止Exceeded soft private memory limit of 128 MB with 143 MB after servicing 5 requests total.

Exemple of memory usage graph (you can see the memory growth and crashes) : enter image description here

注意:可以使用其他框架重现该问题webapp2, like web.py


经过更多调查,并在谷歌工程师的帮助下,我找到了对内存消耗的两种解释。

上下文和线程

ndb.Context是一个“线程本地”对象,仅当线程中有新请求时才被清除。因此线程在请求​​之间保留它。 GAE 实例中可能存在许多线程,并且在第二次使用线程并清除其上下文之前可能需要数百个请求。
这不是内存泄漏,但内存中的上下文大小可能会超出小型 GAE 实例中的可用内存。

解决方法:
您无法配置 GAE 实例中使用的线程数。因此,最好使每个上下文尽可能最小。避免上下文内缓存,并在每次请求后清除它。

事件队列

看来 NDB 不保证事件队列在请求后被清空。同样,这不是内存泄漏。但它离开了Futures在你的线程上下文中,你又回到了第一个问题。

解决方法:
将所有使用 NDB 的代码包装起来@ndb.toplevel.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google ndb 库中的内存泄漏 的相关文章

随机推荐

  • jQuery 航点插件

    你好吗 当我向下滚动页面时 我使用粘性元素的路径点插件 不过 我希望在页面的某个位置删除粘性元素 比如说距离起始滚动点 30px 然后当用户向上滚动页面时 粘性元素将其带回到其原始起点 JavaScript function Do our
  • 使用 dotnetRDF 查询 dbpedia sparql 端点 - RDFParseException

    当我执行以下查询时http dbpedia org sparql http dbpedia org sparql使用 dotnetRDF VDS RDF Query SparqlRemoteEndpoint QueryWithResultS
  • 在sharepoint中按组获取用户

    谁能告诉我如何使用 sharepoint 获取某个组内的用户 所以我有一个包含用户和 或组的列表 我想检索该列表中的所有用户 有没有办法区分列表项是组还是用户 如果它是一个组 我需要获取该组内的所有用户 我正在使用 C 我正在尝试通过使其成
  • 如何根据请求正文使用 HAProxy 路由流量(反向代理)

    我尝试根据下面的 POST 正文中标识的 URL 将以下请求路由到适当的服务器 我希望通过使用 HAProxy 的反向代理来完成此任务 例如 我想将所有请求定向到 HAProxy 然后让 HAProxy 检查 POST 正文中是否存在某些值
  • Rails 2.3 中的响应中是否可以省略 set-cookie 标头?

    假设某些操作只需要返回 xml 或 json 并且它们不应该发送供浏览器使用的 cookie 内容 AFAIK 这是 Rails 3 中金属的一个用例 但在 2 3 中是否可行 除了机架级别 None
  • 更改 LinearLayout 中分隔线的颜色

    我可以知道如何更改分隔线的颜色吗LinearLayout
  • 如何使用 http 上的智能协议(原始)获取 git 对象?

    我正在尝试使用 git 智能协议通过 http 从 github com git git 获取标签 v2 4 2 的注释 获取引用 curl H User Agent git 1 8 1 v https github com git git
  • PHP MYSQL -> 显示从 MYSQL 数据库保存为“日期”类型的日期

    我还在习惯使用 PHP 和 MYSQL 所以请耐心等待 我有一个名为 employee datetable 的数据库表 其中包含一个名为 datetime 的字段 其中包含明年实际日期的 365 条记录 2014 年 8 月 13 日到 2
  • 如何从 Google Chrome 启用本地文件系统读写访问?

    我需要使用 HTML Javascript 代码从 Google Chrome 启用本地文件系统读 写访问 我正在使用存储在本地系统中的一组 html 页面 即 file c project1 page html 我目前的观察是 我们可以使
  • C++纯虚函数有函数体[重复]

    这个问题在这里已经有答案了 纯虚函数 当我们设置 0 也可以有一个函数体 如果纯虚函数根本不会被调用 那么为它们提供函数体有什么用呢 您认为无法调用纯虚函数的假设是绝对错误的 当一个函数被声明为纯虚函数时 它仅仅意味着该函数无法被调用动态地
  • 在哪里可以找到 Google Cloud 计算成本明细?

    我正在尝试 Google 云计算 它与 Microsoft Azure 完全不同 但我很难掌握它的窍门 例如 您在哪里可以找到相当于 Microsoft Azure 成本细目的 Google 云计算 请看这个截图 你就会知道我在说什么 微软
  • 检查大型矩阵 Matlab 中的重复条目

    我有一个非常大的矩阵 901x1801 它是通过组合三个相似数组 其中包含重复值 的值来生成的 以使用数学表达式生成唯一的代码 矩阵中充满了这些代码 我的问题是 我如何检查矩阵 901x1801 的每个值都是唯一的并且一次都不重复 或者 谁
  • D3.js 设置初始缩放级别

    我设置了几个图表来放大容器 效果很好 然而 在初始加载时 缩放级别太接近 有没有一种方法可以设置初始缩放级别以避免首先缩小 我熟悉 scale 方法 但没有运气实施它 这是要走的路还是我缺少什么 到目前为止 我所掌握的有关缩放的信息如下 v
  • SSIS 设计器运行速度非常慢

    我正在开发一个 SQL Server 集成服务包 我一直在对这个包进行一些重大重构 现在设计器运行得非常慢 即使在屏幕上移动组件也会导致设计人员停滞 2 3 分钟 查看任务管理器 Visual Studio 在此期间消耗了大约 80 的 C
  • 我可以查看由soap wcf 调用发出的原始请求吗

    我正在使用 WCF 向第三方服务发出 SOAP 请求 该服务要求我签署请求 我认为我正在这样做 但我收到错误 Could not create SSL TLS secure channel所以我想知道是否有办法查看正在发送的原始 xml 以
  • Laravel 4:保护控制器提供的路由

    我正在构建一个 Laravel 4 应用程序 我想保护我的管理区域 因此只有在用户登录 经过身份验证后才能访问它 做这个的最好方式是什么 Laravel 文档说你可以像这样保护路由 Route get profile array befor
  • android edittext 文本向右对齐,标签向左对齐

    我想要一个编辑文本 其中标签 名称 显示在编辑文本的左侧 并且从右到左输入输入 如果我将 android gravity 设置为 right 输入将从右到左 但在这种情况下 标签 即编辑文本的 android text 给出的任何内容 也会
  • 使用 Java 通过 Tensorflow Serving 进行推理

    我们正在将现有的 Java 生产代码转换为使用 Tensorflow Serving TFS 进行推理 我们已经重新训练了模型并使用新的 SavedModel 格式保存了它们 不再有冻结图表 从我读过的文档来看 TFS并不直接支持Java
  • 如何总结 XSL 中 for-each 循环的结果?

    我是 XSL 新手 所以我真的不知道如何做到这一点 我有一个 for each 语句 它对 单元格 类型的每个元素进行一些计算 如何汇总结果并将其存储在变量中以便显示它 我已经包含了部分代码 我希望有人知道这个问题的解决方案 感谢您的时间和
  • Google ndb 库中的内存泄漏

    我认为存在内存泄漏ndb图书馆 但我找不到在哪里 有没有办法避免下面描述的问题 您是否有更准确的测试想法来找出问题所在 这就是我重现问题的方式 我创建了一个包含 2 个文件的简约 Google App Engine 应用程序 app yam