17

私たちは、アプリケーション (たとえば 80% WinApp) に関するパフォーマンス データを、開発の内部と顧客サイトの両方で収集したいと考えています。私たちの目標は次のとおりです。

  • とても速いはずです
  • 軽いほうがいい
  • アプリ全体でさまざまな種類のイベントを追跡/タイミングおよびカウントできるようにする必要があります。
  • ドメイン、コンピュータ名、ユーザー、OS、メモリなどのかなりの量のデータを (効率的に) 収集できる必要があります。
  • 収集されたすべてのデータは、上記のすべてのディメンションにわたって分析可能である必要があります (社内の BI データベースに送信された後)。

また、理想的には、サイト全体またはユーザーごとに比較的構成可能であり、以下を制御できます。

  • これらのパフォーマンス メトリックが収集された場合でも、
  • それらをどのように詳細に収集するか
  • 結果を当社に報告するかどうか

私たちは基本的に、これらのほとんどを行うための独自のシステムを作成することを計画しています。次に、「パフォーマンス パケット」のバイナリ形式、XmlSerialization、および .NET フレームワークの一部であるトレース ログ機能など、いくつかの異なる「永続性」モデルを検討しています。

ただし、これに取り組む前に、「群衆」が提案する推奨事項を確認するために再確認したかった. 私たちがやろうとしていること、そして本質的に現在の行動計画について説明しましたが、目前の問題を最善に解決する方法について、ありとあらゆる提案を探しています。

前もって感謝します。

4

4 に答える 4

18

これらのニーズのほとんどをカバーする比較的新しいプロジェクトであるMetrics.NETをご覧ください。これは、Java の「メトリック」プロジェクトのポートです。

(2016 年 3 月追加:) Metrics.NET プロジェクトは、長い間更新されていなかった後、新しい人に譲渡されました。

于 2014-02-05T19:48:09.320 に答える
8

StatsD の上に何かを構築することを検討できます。

https://github.com/etsy/statsd/

そのための .NET パッケージがここにあります。

https://github.com/robbihun/NStatsD.Client

基本的に、UDP パケットをリモート サーバーに送信するだけなので軽量です。次に、そのリモートサーバーはそれを集約してGraphiteに保存します.Graphiteは、このデータを取得してグラフに変換し、データ保持などを管理します. 分析のために、Graphite では、データを JSON として出力することもでき (これにより、基本的にメトリックが double の配列に変換されます)、記録されたメトリックに適用できる多くの関数とフィルターがあり、それらを他のシステムにフィードすることができます。

Graphite で可能なことの例については、こちらを参照してください。

http://matt.aimonetti.net/posts/2013/06/26/practical-guide-to-graphite-monitoring

ただし、コンピューター名などのクライアントに関するデータを記録できるなど、すべての要件を満たしているわけではありません。しかし、メトリクス名に名前空間を使用することで、おそらくその目標を達成できます。したがって、「client567.orders.loadtime」のようなキーを使用してメトリックを記録し、「client567」は、たとえば、client567 が Windows 7 で IE11 を使用することを格納する他のデータベースのエントリになります。

したがって、これはすぐに使える完全なソリューションではありませんが、優れた基盤を形成すると思います。

もう 1 つのオプションは、NewRelic などの商用プラットフォームを使用することです。

http://newrelic.com/

多くのテクノロジ (ASP.NET から SQL Server、Solr まで) のパフォーマンス監視が付属しています。ただし、監視を処理するバックグラウンドで実行されているエージェント プロセス (Windows 上のサービス) が必要です。多かれ少なかれWebサーバーを対象としており、クライアント側のWPFアプリケーションを監視するにはおそらくあまり適していません.

于 2014-02-06T04:27:11.527 に答える
6

あなたの計画に沿って、私はこのアプローチを取ります:

  1. すべてのパフォーマンス データをログ ファイルに書き込みます。log4net や nlog などの高速な C# ログ ライブラリのいずれかを使用します。これらのフレームワークは、必要に応じてバイナリ アペンダーをサポートします。
  2. アプリが起動したら、使用可能な RAM、CPU などを書き込みます。
  3. PostSharp のようなアスペクト インジェクターを使用して、アプリ内のすべての (非インライン) メソッドにタイマーを自動的に追加します。Stopwatch クラスは、パフォーマンスに大きな影響を与えることはありません。これを構成可能にするには、メソッドの推定優先度に応じてアスペクト インジェクタにログ レベルを変更させます (または独自の属性を使用して指定します)。
  4. 終了時 (または開始時) に、記録されたパフォーマンス データを Web サーバーに送信するようにユーザーに促します。
  5. 途中でデータを圧縮します。

独自のロック クラスを作成することも検討してください。lock(blah)またはを使用する代わりにMonitor.Enter(blah)、ロックに入るまでの待機時間を記録する独自の使い捨てクラスで Monitor.Enter/Exit をラップします。

于 2012-08-04T05:12:38.487 に答える
1

EventLog を使用すると問題が解決するかどうかをテストすることから始めます。EventLog メッセージには多くの情報が含まれており、独自の情報を追加できます。

いくつかの診断については、(カスタム) Performance Countersを参照してください。Windows パフォーマンス カウンターのパフォーマンスを超えるものを作成するのは難しいと思います。

これを何度も書いても無駄かもしれません。

探している出力を取得したり、コンピューター全体でイベントを収集したりするために、イベント ビューアーで特別なフィルターを作成する必要がある場合があります (独自のビューアーを作成することもできます)。

于 2012-08-04T08:30:15.600 に答える