当前位置: 首页 > 面试题库 >

推迟了App Engine:跟踪内存泄漏

严宏朗
2023-03-14
问题内容

我们有一个App Engine应用程序,可将许多较大文件写入Google Cloud
Store。这些文件是动态创建的CSV文件,因此我们将PythonStringIO.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需要被关闭。

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

总共为11个请求提供服务后,超出了128 MB的软私有内存限制和142 MB

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

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


问题答案:

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

  • 应用程序的基准内存占用量(对于python之类的脚本语言沙箱来说,它可能大于实例启动时的占用量,请参阅前端和后端之间的内存使用量差异很大(并且很奇怪))对于html" target="_blank">配置的实例类而言可能太高了适用于应用程序/模块。要解决-选择更高的内存实例类(作为副作用,这也意味着更快的类实例)。或者,如果由于超出内存限制而导致的实例终止率是可以容忍的,则让GAE回收实例:)
  • 活动高峰(尤其是在启用了多线程请求处理的情况下)意味着更高的内存消耗以及内存垃圾回收器的潜在超载。限制并行执行的请求数,在较低优先级的延迟任务处理中添加(较高)延迟,以及其他类似的措施(降低每个实例的平均请求处理率)可以帮助垃圾收集器有机会清除请求中的剩余内容。可伸缩性不应受到损害(使用动态缩放),因为其他实例将启动以帮助达到活动高峰。


 类似资料:
  • 我们有一个应用程序引擎应用程序,它将许多相对较大的文件写入谷歌云商店。这些文件是动态创建的CSV,因此我们使用Python的作为写入该缓冲区的接口。 通常,我们的流程如下所示: 据我们所知,不需要自己关闭。相反,只需要关闭上面的和。 我们在appengine的任务队列调用的

  • 我试图在我们非常小且简单的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开头 技术

  • 我有内存泄漏,我知道它在哪里(我想是这样的),但我不知道为什么会发生。负载测试以下endpoint(使用服务器)时发生内存泄漏: 我非常肯定对象没有被(垃圾回收器)释放。在每一个请求中,应用程序使用的内存都在增长。我做了一些附加测试: 因此,在每个请求中,我都将big object分配给对象作为其属性。我观察到,有了这个附加属性,内存增长得快得多。在60秒内每完成1000个请求,内存会增加100M

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

  • 我们的应用程序中有一个JavaMicorservice,它连接到Postgres以及Phoenix。我们正在使用Spring Boot 2. x。 问题是,我们正在为应用程序执行大约8小时的耐久性测试,我们可以观察到使用的堆在不断增加,尽管我们对VM参数使用了建议,看起来像是内存泄漏。我们分析了堆转储,但根本原因对我们来说并不明确,一些专家能否根据结果提供帮助? 我们实际使用的VM参数是: -XX