6

VS 2005、C# 2.0、.NET 2.0/3.0、Win2003

MultiInstance の一連のパフォーマンス カウンターをインストールしようとしています。一部のシステム パフォーマンス カウンター カテゴリでは、他にインスタンスがない場合でも「合計」を維持していることに気付きました。ASP.NET Apps 2.0.50727 は一例です。

だから私はこれを複製しようとしてきました。インストーラー クラスで次のルーチンを作成し、セットアップ プロジェクトのカスタム アクションに追加します。

public override void Install(System.Collections.IDictionary stateSaver)
{
    //Debugger.Break();
    CounterCreationData data = new CounterCreationData("ZCounter", "ZCtrHelp", PerformanceCounterType.NumberOfItems32);
    PerformanceCounterCategory.Create("ZCategory", "ZCatHelp", PerformanceCounterCategoryType.MultiInstance, new CounterCreationDataCollection(new CounterCreationData[] { data }));
    PerformanceCounter counter = new PerformanceCounter();
    counter.CategoryName = "ZCategory";
    counter.CounterName = "ZCounter";
    counter.InstanceName = "ZTotal";
    counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Global;
    counter.ReadOnly = false;
    counter.RawValue = 0;
    base.Install(stateSaver);
}

行のコメントを外してDebugger.Break()ステップ実行すると、正しいインスタンス名でカウンターが実際に作成されていることがわかります。また、Visual Studio サーバー エクスプローラーには、InstanceLifetime が Global に設定されたインスタンスが表示されます。セットアップ プログラムで RemoveInstance() メソッドを呼び出しません。

それでも、セットアップ プログラムが完了してから数秒後に、そのインスタンスはパフォーマンス モニターと VS サーバー エクスプローラーから消えます。どうすればくっつきますか?それともできますか?

4

4 に答える 4

7

一部のコードは、カウンターをアクティブに維持する必要があります。ASP.Net など、考えられるすべてのインスタンスには、カウンターを維持するサービスがあります。

アプリの一部のインスタンスが実行されている間だけ _Total インスタンスをアクティブにすることに満足できないため、アプリケーションの外部でパフォーマンス カウンターを維持するコードを記述する必要があります。魔法はありません。

監視のニーズを満たす小さなサービスを作成できます。これにより、_Total カウンターが維持されます。更新計画を決定する必要があります。最も簡単な方法は、アプリのすべてのインスタンスで両方のインスタンス (自身のインスタンスと _Total) を更新することです。

パフォーマンス カウンターの背景 - 主に理解すべきことは、通常、プロセス間で共有される共有メモリ領域があり、インターロック操作によって更新されることです。PerfMon (またはその他のアプリ) のようなツールは、最終的に共有メモリ領域に接続して現在の値を取得します。したがって、一部のプロセスでは、その共有メモリ領域を開いて所有する必要があります。したがって、コードの実行が必要な理由。PerfMon は _Total インスタンスを作成しません (平均とレートを可能にするかなり複雑なカウンターの組み合わせがありますが、集計インスタンスを作成するための合計はありません)。

于 2009-11-02T04:36:01.023 に答える
1

私の知る限り、グローバルパフォーマンスカウンターカテゴリは、プロセスがそれを参照するアクティブなハンドルを持っている限り、存続します。システム カウンターは、一部のサービスで合計カウンター インスタンスへのハンドルを保持することによってこれを実現します。

于 2009-10-31T22:45:10.590 に答える
0

「PerformanceCounterCategoryType.SingleInstance」でカテゴリを作成してみてください。

于 2009-06-29T11:30:28.903 に答える
0

単なる提案ですが、作ってみてください

Counter.ReadOnly = true;

最初のパススルーで、カウンターをインクリメントする必要がある場合にのみ False に設定します。

また、カウンターを読み取り専用にする場合は、明らかに次の行をコメントアウトする必要があります。

Counter.RawData = 0;

とにかく、最初のパスはデフォルトで0に設定されていると思います。

お役に立てれば...

于 2009-06-30T03:07:31.707 に答える