2013-09-21 1 views
1

웹 역할이 하나 인 Azure Cloud 프로젝트가 있습니다. 웹 역할 엔드 포인트는 배포 직후 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 성능 카운터에 할당 허용되는 메모리의 양에 대한 캡을 칠 때 문제가 발생하는 것 같다.

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

을 그러나 심지어이와 함께, 난 여전히 문제로 끝날 -

그래서, 나는 나의하여 Web.config에서 아래의 항목과 메모리 할당을 증가시키기 위해 노력했다. 누군가 문제를 해결할 수있는 몇 가지 지침을 제공해 주시겠습니까?

감사합니다.

답변

1

this 문서.

... 응용 프로그램 구성 파일에서 크기를 정의하면 해당 크기는 응용 프로그램이 성능 카운터를 실행시키는 첫 번째 응용 프로그램 인 경우에만 사용됩니다. 따라서 filemappingsize 값을 지정하는 올바른 위치는 Machine.config 파일입니다. ...

+0

이 실제로 작동 :

는 샘플 패턴 (this.performanceCounters가 사용 된 성능 카운터와 사전이다) 그래서 보인다. 감사! 다른 .NET 프로세스가 내 웹 역할 이외의 첫 번째 제작자가 될 수 있는지 확실하지 않습니다. – Himanshu

4

자신의 성능 카운터를 사용하고 있습니까? 성능 카운터를 만든 응용 프로그램 중 하나에서 동일한 예외가 있었지만 제대로 처리하지는 못했습니다.

PerformanceCounter.Dispose()을 호출하는 것으로 충분하지 않습니다. Component.Dispose()에서 상속되며 추가 기능이 추가되지 않습니다.

멀티 인스턴스 PerformanceCounter의 인스턴스를 삭제할 때는 항상 PerformanceCounter.RemoveInstance()을 호출하십시오. 그렇지 않으면 예약 된 메모리 (기본값 512KB)가 가득 찰 때까지 PerformanceCounter 인스턴스가 커집니다.

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; 
     } 
    } 
}