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

应用引擎延迟:跟踪内存泄漏

长孙星汉
2023-03-14

我们有一个应用程序引擎应用程序,它将许多相对较大的文件写入谷歌云商店。这些文件是动态创建的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不需要自己关闭。相反,只需要关闭上面的缓冲区文件流

我们在appengine的任务队列调用的延迟的中运行上述过程。最终,在调用了几次任务后,我们会出现以下错误:

在为总共11个请求提供服务后,超过了128 MB的软专用内存限制,达到142 MB

显然,我们的应用程序内存泄漏。然而,如果上面的代码是正确的(我们承认可能不是这样),那么我们唯一的另一个想法是,通过服务我们的请求(如错误消息所示),一些大量的内存被保存。

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


共有1个答案

司徒修能
2023-03-14

所描述的症状不一定表示应用程序内存泄漏。可能的替代解释包括:

  • 对于为应用程序/模块配置的实例类而言,应用程序的基线内存占用(对于python等脚本语言沙盒而言,基线内存占用可能大于实例启动时的占用,请参阅前端和后端之间的内存使用情况大不相同(奇怪的是))可能太高。修复-选择一个内存更高的实例类(作为副作用,这也意味着一个更快的实例类)。或者,如果由于超出内存限制而导致的实例终止率是可以容忍的,那么让GAE回收实例:)
  • 活动峰值,特别是在启用多线程请求处理时,意味着更高的内存消耗和内存垃圾收集器的潜在过载。限制并行执行的请求数量、在低优先级延迟任务处理中添加(更高)延迟以及其他类似措施降低每个实例的平均请求处理速率,都有助于垃圾收集器清除请求中的剩余内容。可伸缩性不应该受到损害(使用动态伸缩),因为其他实例将被启动以帮助达到活动峰值

相关Q

  • 应用程序引擎(python)如何跨请求管理内存(超过软私有内存限制)
  • 谷歌应用程序引擎数据库查询内存使用情况
  • googlendb库中的内存泄漏
 类似资料:
  • 问题内容: 我们有一个App Engine应用程序,可将许多较大文件写入Google Cloud Store。这些文件是动态创建的CSV文件,因此我们将Python用作缓冲区和写入该缓冲区的接口。 通常,我们的过程如下所示: 据我们了解,它们本身不需要关闭。而是,仅上述内容和需要被关闭。 我们在由App Engine的任务队列调用的中运行上述过程。最终,在几次调用我们的任务后,我们得到以下错误:

  • 我看到了这个Python问题:应用引擎延迟:跟踪内存泄漏 ...同样,我也遇到了这个可怕的错误: 在为总共384个请求提供服务后,超过了128 MB的软专用内存限制 ... 处理此请求后,发现处理此请求的进程占用了太多内存,因此被终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。 根据另一个问题,可能是“实例类”太小,无法运行这个应用程序,但是在增

  • 问题内容: 我看到了这个Python问题:推迟了AppEngine:跟踪内存泄漏 …同样,我遇到了这个可怕的错误: 总共为384个请求提供服务后,超出了128 MB的软私有内存限制 … 处理此请求后,发现处理此请求的进程使用了​​过多的内存并被终止。这很可能导致新流程用于您的应用程序的下一个请求。如果您经常看到此消息,则可能是应用程序内存泄漏。 根据另一个问题,可能是“实例类”太小而无法运行此应用

  • 我有以下代码试图在一个大表上循环(~100k行;~30GB) 但是,我不断遇到以下错误: 处理此请求时,发现处理此请求的进程占用了太多内存,因此终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。 ...有时候...... 在处理总共9个请求后,超过了128 MB的软私有内存限制,达到154 MB 我改变了我的代码,所以我总是在任何给定的时间只提取1

  • 我试图在我们非常小且简单的Spring Boot应用程序中跟踪并确定内存泄漏的根本原因。 它使用以下内容:-Spring Boot 2.2.4-azure servicebus jms Spring Boot starter 2.2.1-MSSQL 功能:该应用程序只发送Azure ServiceBus队列,存储数据并将数据发送到其他目的地。这是一个小应用程序,所以它很容易启动64兆的内存,尽管我

  • 问题内容: 这是我几个月来一直试图寻找的问题。我有一个运行的Java应用程序,它处理xml提要并将结果存储在数据库中。存在间歇性的资源问题,很难追踪。 背景: 在生产包装盒上(问题最明显的地方),我对包装盒的访问不是特别好,并且无法使Jprofiler运行。那个盒子是一个运行centos5.2,tomcat6和java 1.6.0.11的64位四核8GB计算机。它以这些java-opts开头 技术