ISAPIフィルターでは、複数のプロセスの一般的なログファイルの良いアプローチは何ですか?

StackOverflow https://stackoverflow.com/questions/1511290

質問

IIS6または7で実行されるISAPIフィルターがあります。複数のワーカープロセス(「Webガーデン」)がある場合、各w3wp.exeでフィルターがロードされて実行されます。

フィルターが単一の統合ログファイルでアクティビティをログインすることを効率的に許可するにはどうすればよいですか?

  • 異なる(同時)プロセスからのログメッセージは、互いに干渉してはなりません。言い換えれば、W3WP.exeのいずれかから放出された単一のログメッセージは、ログファイルの単一の連続的な行として実現する必要があります。

  • logfileには最小限の競合があるはずです。ウェブサイトは、1秒あたり100のリクエストを提供する場合があります。

  • 厳密な時間順序が望ましい。言い換えれば、W3WP.EXEプロセス#1がT1でメッセージを発し、プロセス#2がT2でメッセージを発する場合、プロセス#1がT3でメッセージを発する場合、メッセージはログファイルに適切な時間順に表示されるはずです。

私が持っている現在のアプローチは、各プロセスが個別のログファイルを所有していることです。これには明らかな欠点があります。

いくつかのアイデア:

  • w3wp.exeの1つを「logfile所有者」に指定し、その特別なプロセスを通じてすべてのログメッセージを送信します。これは、労働者のプロセスリサイクルの場合に問題があります。

  • OS Mutexを使用して、LogFileへのアクセスを保護します。これは高PERFですか?この場合、各w3wp.exeには同じファイルシステムファイルにファイルがあります。それぞれの書き込み後にlogfileをfflushする必要がありますか?これは機能しますか?

助言がありますか?

役に立ちましたか?

解決

最初は、各プロセスが何も共有していないので、私はあなたの現在のアプローチが一番好きだと言いました。したがって、競合が発生するボトルネックがまだあります。それとも、OSとハードドライブコントローラーがそれを処理することについて本当に賢いのでしょうか?

あなたがやりたいことは、実際の仕事をしているスレッドを遅くしないログの文章を持っていることだと思います。

したがって、同じマシンで別のプロセスを実行します(優先度が低いですか?)。実際にログメッセージをディスクに書き込みます。提案されているようにUDPではなく、プロセスが共有することを記憶する他のプロセスと通信します。また、メモリマッピングされたファイルとしても知られています。もっと メモリマップされたファイル. 。私の会社では、同じボックスでの通信用のループバックTCP/IPよりもはるかに速いメモリマッピングファイルが見つかったので、UDPよりも速くなると思います。

あなたが実際にあなたの共有メモリに持っているのは、スターターにとって、Mutexを使用してプッシュとポップが保護されるSTD ::キューです。 ISAPIスレッドは、ミューテックスをつかんでキューに物を入れます。ロギングプロセスは、ミューテックスをつかんでキューから物を引き離し、ミューテックスを解放し、エントリをディスクに書き込みます。ミューテックスは、共有メモリの更新のみを保護しているため、ファイルの更新ではないため、理論的には、ミューテックスは段階的な時間保持され、ボトルネックが少なくなると思われます。

ロギングプロセスは、タイムスタンプを順番に取得するために書いているものの順序を再配置することさえできます。

別のバリエーションは次のとおりです。各プロセスに個別のログを作成しますが、各プロセス内にロガースレッドがあるため、メインの時間批判的なスレッドが作業を進めるためにログが発生するのを待つ必要がないようにします。

ここで書いたすべての問題は、システム全体(ハードウェア、OS、マルチコアCPU L1/L2キャッシュが機能する方法、ソフトウェアが複雑すぎて、それを介して単に考えるだけで簡単に予測できる」ことです。いくつかの簡単な概念アプリをコード化し、いくつかのタイミングでそれらを機器にし、実際のハードウェアで試してみてください。

他のヒント

ここでは、データベースへのロギングは理にかなっていますか?

過去にUDPベースのロギングシステムを使用していましたが、この種のソリューションに満足していました。

ログは、UDPを介してログコレクタープロセスに送信され、定期的にファイルに保存することを担当します。

それがあなたの高PERFのコンテキストで機能するかどうかはわかりませんが、私はストレスの少ないアプリケーションでそのソリューションに満足しました。

私はそれが役立つことを願っています。

ファイルへのアクセスを制御するOS Mutexではなく、LockFile()とUnlockFile()を使用してWin32ファイルロックメカニズムを使用できます。

私の提案は、ログの記録を担当するプロセスに非同期(UDP)を送信することです。
プロセスは次のとおりです。
-1つのスレッドレシーバーがメッセージをキューに配置します。
-1つのスレッドは、時間の注文リストに入力するキューからメッセージを削除する責任があります。
- リスト内の1つのスレッドモニターメッセージと最小値より大きい時間の長さのメッセージのみをファイルに保存する必要があります(遅延メッセージが順番に書き込まれるのを防ぐため)。

ファイルを分離するためにログを続け、後でマージするツールを見つけて/書き込むことができます(おそらく自動化されているか、ファイルを使用するポイントで実行することもできます。)

Windowsのイベントトレース, 、Windows Vistaに含まれており、その後はこれに最適な機能を提供します。

抜粋:

Windows(ETW)のイベントトレースは、カーネルまたはアプリケーション定義のイベントをログファイルにログに記録できる効率的なカーネルレベルのトレース機能です。イベントをリアルタイムまたはログファイルから消費し、アプリケーションをデバッグしたり、アプリケーションでパフォーマンスの問題が発生しているかを判断することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top