【发布时间】:2012-12-01 17:29:36
【问题描述】:
我正在调查“传统”.NET 服务器应用程序在生产中引发 OutOfMemoryException 的事件。我的目的是解释通过性能监视器收集的数据的特定部分,并就如何继续前进寻求一些建议。让我从一个事实列表开始:
- 该进程已经运行了 20 多天,直到崩溃。
- 它崩溃了,因为抛出了 System.OutOfMemoryException 类型的异常。
- 过去也发生过类似的事件。同样,应用程序崩溃需要很长时间。
- 进程已通过性能监视器由以下计数器监控:# Bytes in all Heaps、% Processor Time、Private Bytes、Working Set。
- 我们无法在生产环境中捕获任何内存转储,并且我们无法重现它。
在第一个屏幕截图中,您可以看到计数器在 7 天内的整体行为。事情相当稳定。第二个屏幕截图显示了崩溃前后最后一分钟的行为。 下午 3:13:49 记录了 OutOfMemoryException。
我的问题是: 1.Working Set 突然增加是什么意思?它总体稳定在 650 多 MB,并在 10 秒内攀升至 1.3GB。 2. 我应该专注于寻找在崩溃前触发OOM的东西,还是累积因素?如您所见,私有字节和所有堆上的字节非常稳定。
【问题讨论】:
-
服务器应用程序基本上在做什么?我认为当时负载没有显着变化。
-
它有许多本地连接到它的客户端,通过 .NET 远程处理。主要是处理输入请求,执行所需的操作来处理它们(包括大量的数据库查询)并回复。至于工作量,在它崩溃的那一刻是相当高的,但这在那个时候是很常见的。客户数量不是问题。这是一个可预测的数字 - 没有任何客户端连接溢出。
-
很抱歉没有更多帮助。如果它稳定了 20 天,那么我将专注于最后 10 秒。在 10 秒内从 650mb 变为 1.3 意义重大。并不意味着找到重要的原因会很容易。任何工作的集合可能已经无限增长?
-
欢迎任何意见!内存增加会影响工作集计数器,但不会影响 Private Bytes。这是我正在寻找的答案之一:WorkingSet 增加意味着什么?我过去处理过其他 OOM 情况,一直存在可见的内存泄漏(私有字节增加等)。
-
Private Bytes 通常会涵盖您的应用所触及的页面。工作集涵盖了最近读取和/或写入的所有资产私有字节、共享 dll、内存映射文件等。 PB 是平的,所以你的应用直接接触的页面似乎不是根本原因。 GC 堆大小是否与平坦的 PB 值相呼应?您可能正在加载一个新的 DLL、COM 或类似的东西?堆栈转储出 OOM 异常?接下来我会使用远程调试器或 Autocrash 转储 - blogs.msdn.com/b/dotnet/archive/2009/10/15/…
标签: .net memory out-of-memory perfmon working-set