会社の .NET ベースのサイトとしてパフォーマンス カウンターを使用することを検討しているときに、パフォーマンス カウンターを使用することによるオーバーヘッドがどれくらい大きいか疑問に思っていました。
サイトのカウンターを継続的に更新する必要がありますか?それとも、測定するときだけ更新する方がよいでしょうか?
会社の .NET ベースのサイトとしてパフォーマンス カウンターを使用することを検討しているときに、パフォーマンス カウンターを使用することによるオーバーヘッドがどれくらい大きいか疑問に思っていました。
サイトのカウンターを継続的に更新する必要がありますか?それとも、測定するときだけ更新する方がよいでしょうか?
一般に、パフォーマンス カウンターを設定するオーバーヘッドは、心配するほど高くはありません (CLR が実際に管理を行うため、共有メモリ領域といくつかの .NET オブジェクトの設定、および CLR のオーバーヘッド)。ここでは、PerformanceCounter などのクラスについて言及しています。
パフォーマンス カウンターの登録のオーバーヘッドはかなり遅くなる可能性がありますが、マシン全体の状態を変更する必要があるため、セットアップ時に 1 回発生することを意図しているため、通常は問題になりません。あなたが行うコピーによって、それは小さくなります。通常、実行時に実行したいことではありません。ここでは、PerformanceCounterInstaller について言及しています。
一般に、パフォーマンス カウンターを更新するオーバーヘッドは、共有メモリでインターロック操作を実行するコストになります。これは通常のメモリ アクセスよりも遅くなりますが、プロセッサ プリミティブです (キャッシュを含むメモリ サブシステム全体でアトミック操作を取得する方法です)。一般に、このコストは心配するほど高くはありません。通常のメモリ操作の 10 倍になる可能性があり、更新やスレッドや CPU 間の競合の状況によっては悪化する可能性があります。しかし、これを考慮してください。アトミックな更新を使用したクロスプロセス通信のインターロック操作よりも優れた処理を行うことは文字通り不可能であり、ロックは保持されません。ここでは、PerformanceCounter.Increment および同様のメソッドを参照します。
パフォーマンス カウンターの読み取りのオーバーヘッドは、通常、共有メモリからの読み取りです。他の人が言ったように、(他のサンプリングと同じように) 妥当な期間でサンプリングしたいのですが、PerfMon について考えて、サンプリングを人間の規模 (ミリ秒ではなく秒で考えてください) で維持しようとすると、おそらく何もありません。問題。
最後に、経験へのアピール: パフォーマンス カウンターは非常に軽量であるため、カーネルからドライバー、ユーザー アプリケーションまで、Windows のあらゆる場所で使用されます。Microsoft は内部的にそれらに依存しています。
アドバイス: パフォーマンス カウンターに関する実際の問題は、理解の学習曲線 (中程度) と、正しいものを測定する曲線 (簡単に思えますが、しばしば間違っている) です。
更新時のパフォーマンスへの影響はごくわずかです。Microsoft の意図は、常にパフォーマンス カウンターに書き込むことです。パフォーマンスの低下を引き起こすのは、これらのパフォーマンス カウンターの監視 (またはキャプチャ) です。そのため、perfmon などを使用してデータをキャプチャする場合のみです。
実際には、パフォーマンス カウンター オブジェクトは、"測定時に実行する" だけの効果があります。
私はこれらをたくさんテストしました。
古い Compaq 1Ghz 1 プロセッサ マシンで、約 10,000 のカウンターを作成し、約 20% の CPU 使用率をリモートで監視できました。これらはカスタム カウンターではなく、CPU などをチェックするだけです。
基本的に、まともな新しいマシンのすべてのカウンターをほとんど影響なく監視できます。
オブジェクトのインスタンス化には、数秒から数分という長い時間がかかる場合があります。収集するすべてのカウンターに対してこれをマルチスレッド化することをお勧めします。そうしないと、アプリが永遠にそこに座ってこれらのオブジェクトを作成します。非常に時間がかかる作成後にMSが何をするかはわかりませんが、1つのカウンターと1つのスレッドで実行できると同時に、1000のスレッドで1000のカウンターで実行できます。
パフォーマンスカウンターは、共有メモリ(メモリマップトファイル)の4/8バイトへの単なるポインターであるため、それらのコストは、int/long変数にアクセスする場合と非常に似ています。
私は有名なhamsandwich に同意しますが、サンプリング レートが妥当 (5 秒以上) であり、妥当な一連のカウンターを監視している限り、測定の影響も無視できる (ほとんどの場合) ことを付け加えておきます。
私が発見したことは、ほとんどのアプリケーションでそれほど遅くないということです。タイトなループや、1 秒間に何千回も呼び出されるようなものには入れません。
次に、パフォーマンス カウンターをプログラムで作成すると非常に時間がかかることがわかったので、コードではなく事前に作成するようにしてください。