自定义计数器文件视图内存不足

时间:2013-09-21 23:38:57

标签: c# wcf azure performancecounter

我有一个带有一个Web角色的Azure Cloud项目。 Web角色端点几乎在部署后立即返回HTTP 400 - 错误请求。当我签入跟踪消息日志时,我看到以下异常 -

Type : System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Custom counters file view is out of memory.
Source : System
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : Int32 CalculateMemory(Int32, Int32, Int32 ByRef)
HResult : -2146233079
Stack Trace :    at System.Diagnostics.SharedPerformanceCounter.CalculateMemory(Int32 oldOffset, Int32 totalSize, Int32& alignmentAdjustment)
   at System.Diagnostics.SharedPerformanceCounter.CreateCategory(CategoryEntry* lastCategoryPointer, Int32 instanceNameHashCode, String instanceName, PerformanceCounterInstanceLifetime lifetime)
   at System.Diagnostics.SharedPerformanceCounter.GetCounter(String counterName, String instanceName, Boolean enableReuse, PerformanceCounterInstanceLifetime lifetime)
   at System.Diagnostics.SharedPerformanceCounter..ctor(String catName, String counterName, String instanceName, PerformanceCounterInstanceLifetime lifetime)
   at System.Diagnostics.PerformanceCounter.InitializeImpl()
   at System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)

似乎问题是当.NET达到允许分配给性能计数器的内存量上限时引起的。

因此,我尝试使用Web.config中的以下条目增加内存分配 -

<configuration> 
<system.diagnostics> 
<performanceCounters filemappingsize="33554432" /> 
</system.diagnostics> 
</configuration> 

但即便如此,我仍然会遇到这个问题。有人可以提供一些指导来解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

您使用的是自己的演出计数器吗?我们的一个应用程序中有相同的例外,它们创建了性能计数器,但没有正确配置它们。

请注意,调用PerformanceCounter.Dispose()是不够的 - 它只是继承自Component.Dispose()并且不添加其他功能。

所以在处理多实例PerformanceCounter的实例时总是调用PerformanceCounter.RemoveInstance(),否则你的PerformanceCounter实例会增长,直到保留的内存(默认为512 KB)已满。

示例模式看起来如此(this.performanceCounters是一个包含使用过的性能计数器的字典):

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        if (this.performanceCounters != null)
        {
            foreach (PerformanceCounter counter in this.performanceCounters.Values)
            {
                counter.RemoveInstance();
                counter.Dispose();
            }

            this.performanceCounters = null;
        }
    }
}

答案 1 :(得分:2)

来自this文档。

...如果在应用程序配置文件中定义大小,则仅在应用程序是导致性能计数器执行的第一个应用程序时才使用该大小。因此,指定filemappingsize值的正确位置是 Machine.config 文件。 ...