2010-11-30 33 views
9

私は、TCPを介してクライアント要求を処理し、Windows EventLogにイベントを書き込んでいるサービスアプリケーションを持っています。このアプリケーションは、多くのクライアントにサービスを提供する予定であり、短時間に各クライアントからのリクエストがたくさんあるとします(1秒あたり1〜50リクエストと言えば)、CPUの賢明さと時間をどれくらい集中させるのか、どのくらい高速にWindows EventLogに書き込むことができますか?Windowsイベントログ:どのくらい高速な操作ですか?

もっと具体的には、EventLogへの接続、読み書き、およびEventLogへの書き込みの操作はどれだけ重要ですか?

+0

イベントログにはどのようなイベントが記録されていますか?あなたの質問に対する答えへのポインタは、IISなどのサーバーがイベントログではなくテキストログに書き込むことがあります。 – Lazarus

+0

現時点では単純なテキストメッセージのみです。シンプルなテキストファイル(ログファイル)を使用することもできますが、私はまだEventLogについてもっと知りたいと思っています。 – LightBulb

答えて

6

私は2つのイベントログクラスを使ってテストを行いました.1つはファイルへの書き込みです(それぞれlog_event()は既に開いているファイルに書き込んでフラッシュします)。そして1つはEventLog(既に登録されているEventSourceのReportEvent()呼び出し)私の場合、ファイルログはEventLogよりも約10倍高速でした。マルチスレッド環境では、ファイルへの書き込みを保護するためのクリティカルセクションを追加します。

私の意見では、ファイルはより良いです:彼らはgrepのようなツールで簡単に解析されます。スピードはそれほど重要ではありません。

+0

これは私が探していた答えの一種です。また、ログファイルを使用するほうが、より高速で簡単な方法であることに同意しましたが、Windows EventLogにすべてのイベントを書き込んでいる既存のサービスアプリケーションを維持するタスクが与えられました。私はそれが "重いワイト"ロギング施設だと思ったので、私は私の質問をしました。 – LightBulb

12

しないでください。イベントログは、そのようなアクティビティー用に設計されていません。

  1. 最大サイズです。
  2. 最大サイズに達すると、設定に応じてイベントを上書きしたりログを停止したりすることができます(最近のWindowsではログをアーカイブして新しいログを開始することもできます)。イベントが上書きされない場合、ログが手動でクリアされるまで、パーティションを埋めるか、他のアプリケーションをブロックすることができます。

イベントログは一般的なログ機能ではありません。エラー、注意が必要な状況、さらには有益なレポートを報告するために使用するべきですが、どこかに書かなければならない少しの情報ではありません。大量のログが必要な場合は、独自のログ機能を使用し、必要に応じて詳細なデータを見つけるための「ポインタ」をイベントログに記録します。

注:本当にイベントログが必要な場合、少なくともアプリケーションは標準のもの(アプリケーションまたは悪いシステム)ではなく、独自のログ宛先を使用する必要があります。このようにして他のアプリケーションの操作に影響を与えることはなく、他のアプリケーションイベントをイベントで「フラッディング」することはなく、他のアプリケーションイベントを探すことなく他のアプリケーションイベントを見つけるのをより困難にします。

+1

+1良いアドバイス、私のアプリは一度クライアントのサイトでイベントログを記入し、それはトラブルの終わりを引き起こしませんでした! –

+0

私はあなたのお勧めに同意します。私のケースでは、EventLogに書き込んでいる既存のサービスアプリケーションを維持する必要があるため、アプリケーションの全体的なパフォーマンスにどの程度影響するかを知りたいと思っていました。 – LightBulb

+0

Windowsとそのマシンで実行されているすべてのアプリケーションの全体的な作業に影響を及ぼす危険性があります。とにかくあなたとあなたの顧客まで。 –

10

Event Tracing for Windowsは、このレベルのトラフィックに適したリポジトリです。

のWindows(ETW)イベントトレーシングは、ログファイル にカーネルや アプリケーション定義のイベントを記録することができます 効率的なカーネルレベルのトレース 施設です。 のイベントをリアルタイムまたはログファイルから消して、アプリケーションをデバッグするのに を使用するか、 がアプリケーションで発生する場所を と判断することができます。

サンプル擬似コード:

const 
    MyApplicationProviderGUID: TGUID = '{47A0DECE-4DCF-4782-BCF4-82AECA6BAAB7}'; 
private 
    FETWRegistrationHandle: THandle; 

... 

EventRegister(MyApplicationProviderGUID, nil, nil, {out}FETWRegistrationHandle); 
... 
EventWriteString(FETWRegistrationHandle, 0, 0, 'Hello'); 
EventWriteString(FETWRegistrationHandle, 0, 0, ', '); 
EventWriteString(FETWRegistrationHandle, 0, 0, 'world'); 
EventWriteString(FETWRegistrationHandle, 0, 0, '!'); 
... 
EventUnregister(MyApplicationProviderGUID); 
+0

これは非常に興味深いですね。リアルタイムアプリケーションのパフォーマンスを収集して分析するための非常に優れた方法と思われるので、詳細を読む必要があります。 – LightBulb

+1

はい、イベントログと同じくらいシンプルではありませんが、より多くのパフォーマンスがあります。 –

+0

ETWについて言及するつもりはありませんでした。 –

1

たぶんMicrosoft Message Queuing (MSMQ)は、WindowsのEventLogに代わるものです。現在のWindowsのすべてのバージョンで使用でき、疎結合の高速メッセージングを提供します。

+0

MSMQも面白く聞こえます。私はそれについてもっと読んで、私の仕事に役立つかどうかを見ていきます。 – LightBulb

関連する問題