每天大约在同一时间突然释放内存


10

我在Windows Azure上有一些运行我们的电子商务网站的VM,最近我们开始使用Telegraf,InfluxDb和Grafana来监视这些计算机。经过几周的数据收集,我注意到与“ 可用内存” 度量标准有关的怪异模式:

我几乎每天几乎总是在同一时间段内释放大量的内存,由于我的非常非常有限的DevOp技能,我不知道是什么原因造成的。

这是显示此模式的图表:

奇数模式

我的问题是:什么会导致这样的事情?我很想怀疑应该归咎于内存泄漏,但是...可用内存永远不会降到70%以下,而只会在流量最大的两个VM中发生!

看到类似这样的内容时,我应该担心吗?

PS:我一直在为我们运行的每个Windows服务以及w3wp进程收集Private e Virtual字节的度量标准...尽管我已经读过,这个度量标准并不是很可靠,无法确定您是否有内存泄漏,但至少我将尝试获取某种趋势,并查看其是否与上述模式相关。


2
您会看到通常的垃圾收集器或缓存清理恕我直言。您的网站用哪种语言完成?(这可能是您的应用程序,您的Web服务器,甚至是系统在进行一些清理)
Tensibai'5

我也对此感到怀疑...它是在ASP.NET MVC 4中完成的,因此垃圾收集理论是有道理的。另外,顺便提一下,我在w3wp进程和Windows服务上收集的指标看起来绝对正常。
安东尼奥·塞吉奥·西蒙斯

我对ASP几乎一无所知,但是我认为有一种方法可以像Java中那样绘制内存消耗和垃圾回收图,这应该有助于确保这是根本原因。
Tensibai'5

Answers:


7

我已经在其他系统中看到了相同的“锯齿”模式,尤其是基于Java的数据工具。根据您的描述,我认为您正在研究 .NET垃圾收集(假设这是一个.NET应用程序。)Java和.NET都是内存管理语言和使用垃圾收集的框架。

内存泄漏是在上,其覆盖或混淆垃圾收集器的存储器管理框架缺乏存储器管理,或在一个程序框架通常发现。

这些是您流量最高的服务器这一事实很有意义。您会看到.NET框架根据需要分配内存,然后垃圾回收器按常规周期启动,并使用垃圾回收算法回收未使用的内存。除非您要跟踪特定的性能问题,否则我认为这种内存使用模式不会有问题。


这确实是一个.NET应用程序,根据我过去几天的研究,您和@Tensibai编写的内容非常有意义。
安东尼奥·塞吉奥·西蒙斯

7

我认为已经找到了为什么这张图看起来像这样。

我也在收集ASP.NET应用程序/错误总数性能计数器的指标,并且我注意到,恰好在发生可用内存激增的同时,“总错误”指标重置为0。

根据msdn的说法,每次应用程序重新启动/关闭时,此计数器都会重置为0。

这使我相信,此“可用内存”锯齿模式的原因是由于重新启动应用程序引起的。

我的图表如下所示:

错误总计ASP.NET应用程序 记忆激增

更新

发生这种情况是因为W3WP进程的“专用字节数”达到了回收的限制(我们在应用程序池中配置了“专用字节数”限制)。仔细查看“专用字节数”图表,我们可以看到发生了一些异常,因为内存使用量从650MB跃升至3.2GB,几个小时后从3.6GB跃升至16.6GB!这是回收发生的时间。


2
这是更合理的解释。突然的内存释放几乎只在进程重新启动时发生。释放正在运行的进程的内存的机制从来没有这么尖锐,很少真正释放内存,而不是释放预分配堆上的一些空间。
吉里·克鲁达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.