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

跟踪Google App Engine Golang应用程序中的内存泄漏?

方权
2023-03-14
问题内容

我看到了这个Python问题:推迟了AppEngine:跟踪内存泄漏

…同样,我遇到了这个可怕的错误:

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

处理此请求后,发现处理此请求的进程使用了​​过多的内存并被终止。这很可能导致新流程用于您的应用程序的下一个请求。如果您经常看到此消息,则可能是应用程序内存泄漏。

根据另一个问题,可能是“实例类”太小而无法运行此应用程序,但是在增加它之前,我想确定一下。

在检查完应用程序后,我看不到任何可能的泄漏点(例如,未关闭的缓冲区等)…,因此无论它是什么,它肯定是一个很小但可能是常见的错误。

因为它是在GAE上运行的,所以据我所知,那是运行时环境,因此我无法真正真正地在本地对其进行概要分析。
可能有人会对如何进行操作并确保正确回收内存提出建议。 —我是Go的新手,但到目前为止,我一直很喜欢使用它。


问题答案:

首先,您可以尝试pprof.WriteHeapProfile。它将写入任何一个Writer,包括一个http.ResponseWriter,因此您可以编写一个视图以检查某些auth并为您提供堆配置文件。令人讨厌的是,它实际上是在跟踪
分配 ,而不是跟踪GC之后 剩余的 分配。因此,从某种意义上讲,它是在告诉您需要多少RAM,但并没有专门针对泄漏。

标准expvar包可以公开一些包含memstats的JSON,它告诉您关于GC以及特定分配大小的allocs
frees的数量(示例)。如果有泄漏,您可以使用allocs-
frees了解随着时间的推移增长的是大型分配还是小型分配,但这并不是很精细。

最后,有一个函数可以转储堆的当前状态,但是我不确定它是否可以在GAE中使用,并且似乎很少使用。

请注意,为保持GC正常运行,Go进程的增长是其 正常 实时数据的两倍, 是正常稳态操作的一部分
。(在GC依赖之前runtime.GOGC,它增长的确切百分比,人们有时会增加以节省收集器的工作,以换取使用更多的内存。)一个(很旧的)线程建议App
Engine进程像其他任何进程一样对GC进行调节,尽管他们可能对此进行了调整2011。无论如何,如果分配缓慢(对您有好处!),您应该 期望
流程增长缓慢;只是用法应该在每个收集周期之后再次下降。



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

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

  • 我知道Java中内存分配的基本原理——应用程序占用的大部分内存都分配在堆上,堆由所有线程共享,因此没有线程拥有对象的概念,您无法轻松计算线程使用它拥有的所有对象占用了多少内存。 但我想知道是否有任何方法可以计算和汇总从特定线程触发的分配?内存分配发生在堆上,但它总是由想要创建对象的线程触发,所以我想知道是否可以以某种方式分析这种关系? 我的想法是,一个典型的Spring Boot应用程序将引导,从

  • 问题内容: 我们有一个App Engine应用程序,可将许多较大文件写入Google Cloud Store。这些文件是动态创建的CSV文件,因此我们将Python用作缓冲区和写入该缓冲区的接口。 通常,我们的过程如下所示: 据我们了解,它们本身不需要关闭。而是,仅上述内容和需要被关闭。 我们在由App Engine的任务队列调用的中运行上述过程。最终,在几次调用我们的任务后,我们得到以下错误:

  • 我有一个运行在Tomcat7上的Java web应用程序出现内存泄漏。在负载下(使用JConsole确定),应用程序的平均内存使用量随时间线性增加。在内存使用达到稳定期后,性能会显著下降。响应时间从大约100ms到[300ms,2500ms],所以这实际上导致了真正的问题。 使用VisualVM,我看到至少一半的内存被字符数组(即char[])使用,而且大多数字符串(每个实例的数量大致相同,为30

  • 问题内容: 我在Linux中玩ptrace。我正在尝试使用/ proc / pid / mem接口编写跟踪进程的内存。 我用来完成此任务的功能是: 但是我总是会得到错误:编写:错误的文件描述符。 是否可以使用此方法编写跟踪过程? 问题答案: 您正在以只读模式()打开文件。我建议改用: 但是,从目前尚不清楚这是否可行: memory through open(2), read(2), and lse