3

着信メッセージをUDPでリッスンするアプリケーションを作成しています。私のメインスレッドは、ネットワークからメッセージを次々と受信し、エグゼキュータを使用して処理するために、それぞれを新しいスレッドに渡します。

各処理スレッドは、担当するメッセージに対して必要な処理を実行し、LinkedBlockingQueueすべての処理スレッド間で共有されるメッセージに追加します。

次に、10000メッセージのブロックごとにキューを排出し、メッセージのブロックをDBに挿入するDBワーカースレッドがあります。

LOAD DATA INFILEメッセージの到着率が高い(1秒あたりのメッセージ数が20000以上)可能性があるので、使用する方が効率的だと思いました。したがって、このDBワーカースレッドは前述のようにキューを排出し、CSV形式を使用してすべてのメッセージを含む一時ファイルを作成し、作成されたファイルを別のエグゼキューターを使用して別のスレッドに渡します。この新しいスレッドは、LOAD DATA INFILEを使用してステートメントを実行しJDBCます。

アプリケーションをテストした後、パフォーマンスはそれほど良くないと思います。マルチスレッドレベルとDBアクセスレベルの両方でパフォーマンスを向上させる方法を探しています。

MySQLをDBMSとして使用していることを正確に示しています。

ありがとう

4

2 に答える 2

3

パフォーマンスが悪い理由を特定する必要があります。

たとえば、ボトルネックになる可能性がはるかに高いデータベースにデータを順番に書き込む場合は、複数のスレッドは必要ない可能性が非常に高くなります。必要のないときに複数のスレッドを使用する場合の問題は、それ自体がオーバーヘッドである複雑さを追加し、単一のスレッドを使用するよりも遅くなる可能性があることです。

データをデータベースにロードする以外のすべてを実行した場合のパフォーマンスを確認してみます。つまり、ファイルを書き込んで破棄します。

于 2012-09-07T09:24:27.897 に答える
0

プロファイラーの出力がないとわかりませんが、私の(知識のない)推測では、ハードドライブ上のファイルに変更を書き込んでから、データベースにこのファイルの読み取りと解析を促すことがボトルネックになっています。ストレージアクセスは常にメモリアクセスよりもはるかに低速です。したがって、これは、データベースにメモリからクエリをフィードするよりもはるかに遅い可能性があります。

しかし、それは単なる推測です。たぶん、ボトルネックはあなたや私がそれを予期していなかったであろうどこか他の場所にあります。アプリケーションのどの部分がCPU時間をどれだけ消費しているかを本当に知りたい場合は、Profiler4jなどのプロファイラーを使用してプログラムを分析する必要があります。

于 2012-09-07T09:25:57.613 に答える