Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net OutOfMemoryException前的工作集峰值_.net_Memory_Out Of Memory_Perfmon_Working Set - Fatal编程技术网

.net OutOfMemoryException前的工作集峰值

.net OutOfMemoryException前的工作集峰值,.net,memory,out-of-memory,perfmon,working-set,.net,Memory,Out Of Memory,Perfmon,Working Set,我正在调查一个事件,其中一个OutOfMemoryException在“传统的”.NET服务器应用程序”的生产中被抛出。我的目的是解释通过Performance Monitor收集的特定部分数据,并就如何继续前进寻求一些建议。让我从一系列事实开始: 在崩溃之前,该过程已经运行了20多天 它崩溃是因为引发了类型为System.OutOfMemoryException的异常 过去也发生过类似的事件。类似地,应用程序崩溃需要很长时间 该进程已通过以下计数器通过性能监视器进行监控:所有堆中的字节,%Pr

我正在调查一个事件,其中一个OutOfMemoryException在“传统的”.NET服务器应用程序”的生产中被抛出。我的目的是解释通过Performance Monitor收集的特定部分数据,并就如何继续前进寻求一些建议。让我从一系列事实开始:

  • 在崩溃之前,该过程已经运行了20多天
  • 它崩溃是因为引发了类型为System.OutOfMemoryException的异常
  • 过去也发生过类似的事件。类似地,应用程序崩溃需要很长时间
  • 该进程已通过以下计数器通过性能监视器进行监控:所有堆中的字节,%Processor Time,Private Bytes,Working Set.
  • 我们无法捕获生产环境中的任何内存转储,并且我们无法复制它
  • 在第一个屏幕截图中,您可以看到计数器在7天内的总体行为。情况相当稳定。第二个屏幕截图显示了崩溃前后最后一分钟的行为。OutOfMemoryException已登录到3:13:49PM

    我的问题是: 1.你知道工作环境突然增加意味着什么吗?它的总容量稳定在650MB,在10秒钟内就上升到了1,3GB。
    2.我应该专注于寻找在崩溃前触发OOM的东西,还是应该是一个累积因素?正如您所看到的,私有字节和所有堆上的字节都非常稳定

    这类问题极难诊断。很可能发生的事情不是触发行为的单一条件的结果,而是一组同时发生的条件

    以下是我们所知道的:

  • 没有显示累积问题:如果问题是累积的,我们预计会看到事件前20天的一些迹象。这并不意味着可以忽略前面的操作。触发该行为的某些条件可能是分阶段的,并在更早的时候开始。根据现有信息,我们无法了解这一点

  • 堆是稳定的:私有字节度量告诉我们保留了多少内存(如Steffu所建议的,未被触摸)。所有堆中的字节告诉我们根据内存管理器(GC)当前分配了多少保留内存。因为这两个都是稳定的,所以看起来问题不一定是内存泄漏。危险在于我们只有10秒钟的有趣数据,而且由于GC通常是相当被动的,所以不清楚这些统计数据会有多准确(特别是对于不稳定的工作集)

  • 工作集表示抖动:工作集告诉我们操作系统希望保留多少物理内存以确保合理的性能。一个不断增长的工作集表明了颠簸。不断增长的工作集通常与两件事相关:

    • 增加分配率

    • 延长对象寿命(通常是暂时的)

    没有指出对象寿命的增加,因为堆没有显示增长。增加分配率是可能的,但对象仍然是短期的(因为没有指示泄漏)

  • 这些观察结果向我表明,某些罕见事件(或一组事件)正在触发以下情况:

    • 高分配率

    • 中等大小物体的测量

    • 它们的寿命不是很长

    • 结果是GC正在颠簸

    有许多这样的条件会导致OutOfMemoryException。我不太清楚为什么会这样。如果您运行的是32位环境,则可能的原因是地址空间的碎片。如果GC无法从操作系统获取连续页面,则可能发生这种情况

    另一种可能性(我无法验证)是GC请求操作系统不分页它正在处理的堆的部分。如果锁定的页面数过高,可能会导致内存不足。这个想法几乎完全是猜测,因为我对Microsofts GC实现的内部结构了解不够

    我现在没有更好的解释,但如果有人能提供的话,我肯定希望有更好的解释

    最后,您可能希望验证是否启用了合理的。如果这是问题所在,我想我们会看到所有堆中的字节都在升级——所以这可能没问题

    PS


    您能检查第二张图表中的虚线表示的变量吗?如果是处理器使用,则与抖动一致。随着对内容分页的需求越来越频繁,磁盘IO应该增加,并且(在某一点上)处理器使用的百分比应该下降,因为所有东西都在等待磁盘。这只是一个额外的细节——如果处理器的使用没有过度下降,抖动仍然是可能的。这是因为软件的某些部分可能仍然表现出良好的局部性,并且能够取得进展。

    这类问题非常难以诊断。很可能发生的事情不是触发行为的单一条件的结果,而是一组同时发生的条件

    以下是我们所知道的:

  • 没有显示累积问题:如果问题是累积的,我们预计会看到事件前20天的一些迹象。这并不意味着可以忽略前面的操作。触发该行为的某些条件可能是分阶段的,并在更早的时候开始。这是一些