0

こんにちは。問題の説明が奇妙で不正確に聞こえる場合は、まず申し訳ありません。私の複雑な問題を英語で説明するのは簡単ではありませんが、私の言いたいことを理解していただければ幸いです。

Web サーバーのアクセス ログを解析するための CLI ツールを作成しました。パフォーマンスと使い方の柔軟性に焦点を当てました。

したがって、MMap を使用して LogFiles をメモリに読み込み、メモリにマップされた char* を並列 OpenMP 処理ループに渡します。

omp parallel for ループでは、boost::regex_search を使用してすべての LogString からいくつかの有益な部分文字列を解析し、イベント データをスレッド ローカルのカスタム LogEvent タイプ オブジェクトに格納します。

現在の文字列からこの LogEvent-Object を作成した後、LogEvent をベクターに追加し、次の文字列の解析に進みます。

注意が必要なのは、プログラムの開始時にユーザー構成ファイルを解析することです。ユーザーは、フィールド名とデータに一致する正規表現を指定することにより、複数の「データ フィールド」を定義できます。

例えば:

Time = \d{2}\/\w{3}\/\d{4}
IP = \d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3}
Object = \d{2,8}\_w\d{1,3}.mp4|\d{2,10}.flv

さらに、ユーザーは出力レポート データが生成される順序を指定できます。

例えば:

field_0 = %IP%
field_1 = %Object%
field_2 = %Time%

出力文字列は次のようになります。

10.20.30.1;video_xyz.flv;Jul/23/2011:11:12;3 
10.20.30.1;video_xyz.flv;Jul/23/2011:11:17;1 
10.20.30.1;video_xyz.flv;Jul/23/2011:11:18;12
10.11.30.1;video_xyz.blabla.mp4;Jul/23/2011:11:12;3  

私が抱えている問題は、ビデオ ファイルをストリーミングすると、ログにいくつかのアクセス イベントが発生することです。クライアント プラットフォームが異なれば、サーバー レスポンス コードを生成する際の動作も異なるため、ストリームをリロード/バッファリングしているだけの人を実際には認識できません。

現在、イベントを複数回カウントしていますが、これはしばしば間違っています。

どうすればこの問題を処理できますか? 私が知っているのはかなり一般的ですが、私のプログラムとそれをどのように記述したかを考えると、私のプログラム設計では問題を解決するのが難しいことがすぐにわかります。

私は回避策を見つけましたが、それは常にパフォーマンスに非常に悪い影響を与え、正当な解決策ではありません.

どういうわけか、解析時にこれらの LogEvents を LogEvent-Objects のベクトルに追加することを避ける必要があります。その時点まで、文字列はまだ正しい時系列順であるため、現在の文字列を以前の文字列などと比較できるからです。

その後、omp クリティカル フェーズが開始され、スレッド ローカルの結果が結合されます。間違った複数のヒット カウントをチェックしたい場合は、データ配列全体を検索する必要がありますが、これは nogo です。

私の問題が十分に明確であることを願っています。何か案は?(サンプルコードが役立つかどうかはわかりません。設計の問題だと思います)...

4

1 に答える 1

0

ついに、しばらく一緒に暮らせる回避策を見つけました。

文字列を解析している間、私は常にすべてのログ文字列からIPアドレスとターゲットアイテムを取得します。

IPアドレスをキーとして保存し、ターゲットアイテム(ビデオストリームなど)を値として保存するスレッドローカルマップがあります。

以前にチェックしたログイベントをカウントしたいときはいつでも、現在処理されているLogsStringsのIPアドレスがすでにスレッドローカルマップのキーであるかどうか。

そうでない場合は、イベントを数えるのが安全です。そして、現在のIPをキーとして、オブジェクトを値として追加します。これは、この特定のIPに対して最後にアクセスされたオブジェクトを更新することを意味します。

すでにマップのキーである場合は、このキーの値(ターゲットアイテム)が現在のLogStringsターゲットと同じであるかどうかを確認します。

もしそうなら、それはこのユーザーが私のサーバー上の何かに最後にアクセスしたのは同じビデオストリームにアクセスしたときだったことを意味する可能性があります。

オブジェクトが変更された場合にのみ、このIPアドレスからのイベントをカウントし続けます。

ユーザーがあるストリームから別のストリームに切り替えてから元に戻る可能性は非常に低いため(カウントするのが正しい場合でも)、ここで新しいイベントを取得したように見えます。これは本当にカウントしたいものです。

これは、逆グレーリストのように機能します。すべてのIPは1回だけカウントされ、新しいオブジェクトのために新しい署名が生成されるまでカウントがブロックされます。

もちろん、これもパフォーマンスへの影響です。より良いアイデアがあれば、遠慮なく答えてください:P

于 2011-08-29T09:57:29.747 に答える