3

サーバーアプリケーションにパフォーマンスカウンターを使用することの価値に皆さんは同意します。

C#を使用してこれらを実装する方法を知りたいです。

通常、パフォーマンスカウンターには次の属性があります。

  1. それらは共有/グローバルです
  2. 書き込みには同期を確保するためにロックが必要です
  3. 読書にもロックが必要な場合があります

それらを非同期的に更新する方が良いですか?それらを非同期にするための最良の方法は何ですか?

ThreadPool.QueueUserWorkItem()関数を使用することを計画しています。これについてどう思いますか?

質問が少し曖昧に思われる場合は、HelloWorldWCFサービスをご覧ください。

また、次のことも知りたいです。

  1. 全体的に、特定の期間内に何回ヒットしたか
  2. 全体および特定の期間内の平均/最小/最大応答時間

.NETまたはWCFでこれを行うための特別な方法を知っている人がいたら、私に知らせてください。

4

2 に答える 2

3

その目的で.NETクラスを使用する場合、パフォーマンスカウンターのインクリメント、デクリメント、およびクエリを手動でロックする必要はありません。フレームワークがそれを行います。

ネイティブコードでパフォーマンスカウンターを使用する必要がある場合でも、InterlockedIncrement()とその仲間を使用する必要があります。

パフォーマンスカウンターを非同期に更新することはあまり良い考えではないと思いますが、マイレージは異なる場合があります。いくつかの興味深い状況に関するデータが事後に到着した場合、それはあまり有用ではないと見なされる可能性があります。すべての場合において、パフォーマンスカウンターを更新するためだけにThreadPoolに圧力をかけることはありません。さて、とにかくスレッドでカウンターをトリガーする作業を行う必要がある場合、それはもちろん別のことです。

一般的に、パフォーマンスカウンターの更新は実際にはボトルネックではなく、カウンターの更新に使用されるデータの収集であると思います。

たとえば、.NET GCメモリパフォーマンスカウンターは、GCが実際に発生したときにのみ更新されます。これは、情報を(バックグラウンドで)追跡して、何かが発生するたびにカウンターを更新するために、コストがかかりすぎるためです(申し訳ありませんが、ここでは参照していませんが、その特定の主題に関するMSブログエントリの組み合わせ)。

最後に、 WCFには、箱から出してすぐに使用できるかなりの数のカウンターがすでに用意されていることに注意してください。これにより、必要なすべてのカウンターがカバーされる可能性があります。

于 2010-04-01T12:55:48.963 に答える
1

標準のWindowsパフォーマンスカウンターを使用できます。

この機能には、system.diagnostics.performancecounter名前空間を使用してc#からアクセスできます。C#の例については、以下を参照してください。

http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx

于 2010-04-01T12:25:28.093 に答える