2

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

フィルタがそのアクティビティを 1 つの統合ログファイルに効率的に記録できるようにするにはどうすればよいですか?

  • 異なる (同時) プロセスからのログ メッセージが互いに干渉してはなりません。つまり、w3wp.exe のいずれかから出力された 1 つのログ メッセージは、ログ ファイル内の 1 つの連続した行として認識される必要があります。

  • ログファイルの競合は最小限に抑える必要があります。Web サイトは、1 秒あたり数百のリクエストを処理する場合があります。

  • 厳密な時間順が優先されます。つまり、w3wp.exe プロセス #1 が t1 でメッセージを送信し、次にプロセス #2 が t2 でメッセージを送信し、次にプロセス #1 が t3 でメッセージを送信した場合、メッセージは適切な時間順にログ ファイルに表示されます。

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

いくつかのアイデア:

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

  • OS ミューテックスを使用してログファイルへのアクセスを保護します。これで十分な高性能ですか?この場合、各 w3wp.exe は同じファイルシステム ファイルに FILE を持ちます。書き込みごとにログファイルをフラッシュする必要がありますか? これは機能しますか?

助言がありますか?

4

7 に答える 7

2

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

あなたがしたいことは、ログの書き込みが実際の作業を行っているスレッドの速度を落とさないようにすることだと思います。

そのため、実際にログ メッセージをディスクに書き込む別のプロセスを同じマシンで実行します (優先度は低くなりますか?)。提案されているUDPではなく、プロセスが共有するメモリを使用して他のプロセスと通信します。紛らわしいことに、メモリ マップド ファイルとも呼ばれます。メモリ マップト ファイルの詳細。私の会社では、メモリ マップ ファイルが同じボックスでの通信のループバック TCP/IP よりもはるかに高速であることを発見したため、UDP よりも高速であると想定しています。

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

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

別のバリエーションを次に示します。プロセスごとに個別のログを作成し続けますが、各プロセス内にロガー スレッドを作成して、タイム クリティカルなメイン スレッドが作業を続行するためにログ記録の発生を待機する必要がないようにします。

ここに書いたことすべての問題は、システム全体 (ハードウェア、OS、マルチコア CPU の L1/L2 キャッシュの仕組み、ソフトウェア) が複雑すぎて、考えただけでは簡単に予測できないことです。いくつかの単純な概念実証アプリをコーディングし、いくつかのタイミングで計測して、実際のハードウェアで試してください。

于 2009-10-17T00:31:46.477 に答える
1

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

ログは UDP 経由でログ コレクター プロセスに送信されます。ログ コレクター プロセスは、ログを定期的にファイルに保存します。

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

お役に立てば幸いです。

于 2009-10-14T19:42:32.790 に答える
1

ここでデータベースへのログ記録は意味がありますか?

于 2009-10-02T19:10:27.117 に答える
0

Windows Vista 以降に含まれているEvent Tracing for Windowsは、これに適した機能を提供します。

抜粋:

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

于 2010-01-20T17:00:09.333 に答える
0

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

于 2009-10-17T01:13:29.667 に答える
0

別のファイルにログを記録し続け、後でそれらをマージするためのツールを検索/作成することができます (おそらく自動化するか、ファイルを使用する時点で実行することができます)。

于 2009-10-17T01:15:58.120 に答える