App Engine 延迟:追踪内存泄漏

2024-01-06

我们有一个 App Engine 应用程序,它将许多相对较大的文件写入 Google Cloud Store。这些文件是动态创建的 CSV,因此我们使用 Python 的StringIO.StringIO作为缓冲区和csv.writer作为写入该缓冲区的接口。

一般来说,我们的流程是这样的:

# imports as needed
# (gcs is the Google Cloud Store client)

buffer = StringIO.StringIO()
writer = csv.writer(buffer)

# ...
# write some rows
# ...

data = file_buffer.getdata()
filename = 'someFilename.csv'

try:
    with gcs.open(filename, content_type='text/csv', mode='w') as file_stream:
        file_stream.write(data)
        file_stream.close()

except Exception, e:
    # handle exception
finally:
    file_buffer.close()

据我们了解,csv.writer本身不需要关闭。相反,只有buffer以上和file_stream需要关闭。


我们在a中运行上述过程deferred,由 App Engine 的任务队列调用。最终,在几次调用我们的任务后,我们收到以下错误:

总共处理 11 个请求后,超出了 128 MB 的软专用内存限制,达到 142 MB

显然,我们的应用程序中存在内存泄漏。但是,如果上面的代码是正确的(我们承认情况可能并非如此),那么我们唯一的其他想法是通过服务我们的请求而保留了一些大量的内存(如错误消息所示)。

因此,我们想知道 App Engine 在执行过程中是否保留了一些实体deferred。我们还应该注意到,尽管有这些错误消息,我们的 CSV 最终还是成功写入的。


所描述的症状不是一定应用程序内存泄漏的指示。潜在的替代解释包括:

  • 应用程序的基线内存占用量(对于像 python 这样的脚本语言沙箱来说,它可能比实例启动时的占用量更大,请参阅前端和后端之间的内存使用情况差异很大(而且很奇怪) https://stackoverflow.com/questions/34268508/memory-usage-differs-greatly-and-strangely-between-frontend-and-backend/34269395#34269395)对于实例类 https://cloud.google.com/appengine/docs/python/modules/#Python_Instance_scaling_and_class为应用程序/模块配置。修理 -选择了更高内存的实例类 https://cloud.google.com/appengine/docs/python/config/appconfig#scaling_and_instance_types(作为副作用,这也意味着更快的类实例)。或者,如果由于超出内存限制而导致的实例终止率是可以忍受的,那么就让 GAE 回收实例:)
  • 活动高峰,特别是在启用多线程请求处理的情况下,意味着更高的内存消耗以及内存垃圾收集器的潜在过载。限制并行执行的请求数量、在较低优先级的延迟任务处理中添加(较高)延迟以及降低每个实例的平均请求处理速率的其他类似措施可以帮助垃圾收集器有机会清除请求中的剩余内容。可扩展性不应受到损害(动态缩放 https://cloud.google.com/appengine/docs/python/scaling#scaling_dynamic_instances),因为其他实例将启动以帮助应对活动高峰。

相关问答:

  • 应用程序引擎(python)如何跨请求管理内存(超出软私有内存限制) https://stackoverflow.com/questions/32981118/how-does-app-engine-python-manage-memory-across-requests-exceeded-soft-privat
  • Google App Engine DB 查询内存使用情况 https://stackoverflow.com/questions/31853703/google-app-engine-db-query-memory-usage
  • Google ndb 库中的内存泄漏 https://stackoverflow.com/questions/33036334/memory-leak-in-google-ndb-library
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

App Engine 延迟:追踪内存泄漏 的相关文章

  • Flask-SocketIO redis 订阅

    我在用着https github com miguelgrinberg Flask SocketIO https github com miguelgrinberg Flask SocketIO实现 WebSocket 服务器 我需要从另一
  • 导入错误:无法导入名称“FFProbe”

    我无法获取ffprobe包 https github com simonh10 ffprobe在 Python 3 6 中工作 我使用 pip 安装它 但是当我输入import ffprobe it says Traceback most
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • 使用 Boto3 超时的 AWS Lambda 函数

    我已经解决了我自己的问题 但无论如何我都会发布它 希望能节省其他人几个小时 我在 AWS 上有一个无服务器项目 使用 Python 将记录插入到 kinesis 队列中 但是 当我使用 boto3 client kinesis 或 put
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • Python Selenium 打印另存为 PDF 等待文件名输入

    我正在尝试通过打印对话框将网站另存为 PDF 我的代码允许我另存为pdf 但要求我输入文件名 我不知道如何将文件名传递到弹出框 附上我的代码 import time from selenium import webdriver import
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 将图与热图(可能是对数)配对?

    How to create a pair plot in Python like the following but with heat maps instead of points or instead of a hex bin plot
  • 如何将 URL 添加到 Telegram Bot 的 InlineKeyboardButton

    我想制作一个按钮 可以从 Telegram 聊天中在浏览器中打开 URL 外部超链接 目前 我只开发了可点击的操作按钮 update message reply text Subscribe to us on Facebook and Te
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 根据标点符号列表替换数据框中的标点符号[重复]

    这个问题在这里已经有答案了 使用 Canopy 和 Pandas 我有数据框 a 其定义如下 a pd read csv text txt df pd DataFrame a df columns test test txt 是一个单列文件
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • tf.print() vs Python print vs tensor.eval()

    看来在Tensorflow中 至少有三种方法可以打印出张量的值 我一直在读here https www freecodecamp org news debugging tensorflow a starter e6668ce72617 an
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到

随机推荐