3

1 つの Web ロールを持つ Azure クラウド プロジェクトがあります。Web ロール エンドポイントは、デプロイのほぼ直後に HTTP 400 - Bad Request を返します。トレース メッセージ ログをチェックインすると、以下の例外が表示されます -

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> 

しかし、これでも、私はまだ問題を抱えています。誰かが問題を解決するための指針を教えてもらえますか?

ありがとう!

4

2 に答える 2

5

独自のパフォーマンス カウンターを使用していますか? アプリケーションの 1 つで同じ例外が発生し、パフォーマンス カウンターが作成されましたが、適切に破棄されませんでした。

呼び出すPerformanceCounter.Dispose()だけでは不十分であることに注意してください。継承するだけでComponent.Dispose()、追加機能は追加されません。

PerformanceCounter.RemoveInstance()そのため、マルチインスタンス PerformanceCounter のインスタンスを破棄するときは常に呼び出してください。そうしないと、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;
        }
    }
}
于 2014-12-03T09:03:41.310 に答える