2010-12-17 15 views
1

タスクは、CPU負荷の高い操作で複数のI/Oストリーム(HTTPダウンロード)を処理する必要があります。理想的には、全帯域幅とCPU 100%を使用したいと考えています。もちろん、CPUの処理量が多いとインターネットのダウンロード速度が遅くなります。未処理のデータをディスクにキャッシュすることができます。この機能を提供するASFまたはその他のコンポーネントに既存のエグゼクティブがありますか?そうでない場合、これを達成するための最良の方法は何ですか? 1つはInternet-To-Disk、もう1つはDisk-To-CPU-To-Disk操作用に2つのスレッドプールがあると考えます。I/Oバウンド操作とCPU負荷操作のJavaスレッド同期

編集:

2スレッド・プール:Internet-To-DiskDisk-To-CPU-To-Disk生産者/消費者のアプローチそのものである

私は私の質問を明確にします。問題はproducersconsumersの正しいスレッド数を選択したことを確認する方法でしたか?同じコードは異なるボックス、異なる数のコアと異なる帯域幅のアーチで同時に動作します。 100%の帯域幅と100%のCPUが消費されるように正しいスレッド数を選択したことを確認するにはどうすればよいですか?

答えて

1

CPU処理がシステムの主要なボトルネックになると仮定すると、CPU処理のスレッド数は、最低限、使用可能なCPUまたはコアの数に設定する必要があります。

I/O部分はおそらく多くのCPUを使用しませんが、余分なスレッドコンテキスト切り替えを防ぐために、数個のスレッド(コア数以下)の固定プールを割り当てたい場合があります同時I/Oストリーム用。

CPU処理スレッドが開始から終了まで常にCPUの100%を使用しない場合は、CPU処理のスレッド数をコア数よりも少し大きな数に設定することもできます。たとえば、処理の途中で何らかのI/Oを実行したり、共有リソースにアクセスしたりする場合があります。

しかし、どのシステムでも、理想的なスレッド数はプログラムの性質に大きく左右されます。 JVisual VM(JDKにバンドルされている)のようなツールを使用して、プログラムでのスレッドの使用方法を分析し、さまざまなスレッド設定のバリエーションを試すことができます。

0

この目的でを使用できます。ニーズを満たすために必要な数のプロデューサとコンシューマを使用します。

+0

これは可能な限り帯域幅とCPUの両方をロードすることを目的としていました(数週間の作業後に何億ものHTMLページをダウンロードする必要はありません)。ダウンロードは停止し、CPU処理のみが維持されます基本的に - 質問は - 両方のプール(またはプロデューサー/コンシューマー)が100%システムを完全にロードするためのバランスをとる方法 - そのバランスのスレッド数を自動的に見つける方法を教えてください。 – Archer

0

CPUステージがダウンロード時間よりも集中している場合は、処理できるようにデータをダウンロードしないでください。そうすれば、複数のインターネットからCPUへのプロセスを持つことができます。ステージをスキップすることで、ステージが速くなることがありますが、ステージは単純になります。

0

プロデューサ - コンシューマアーキテクチャ:データを処理する1つのスレッドプール(ExecutorServiceによって管理される)と、インターネットからデータをダウンロードする1つ以上のスレッド。

処理されるデータは、制限付きブロッキングキュー(例:LinkedBlockingQueue)に格納されるため、ダウンロードスレッドは必要なときだけ(つまり、コンピューティングスレッドが新しいデータを処理できるときに)データをフェッチします。さらに、この構造はスレッドの安全性とメモリの公開を保証します。

+0

スレッドをダウンロードして処理している場合は、お互いに待っているダウンロードスレッドまたは処理スレッドが多すぎることはありません。 –

+0

ブロッキングキューに新しい項目を入れる許可を待機しているスレッドは、待ちモードになります。彼らは安く、CPU時間を消費しません。 そして、アーキテクチャの分かりやすさのために、私はむしろ2つの別々のプールを持っています.1つはダウンローダー用で、もう1つはデータ処理用です。それぞれを独立して構成してチューニングできます。自給自足の「生産者 - 消費者」のパターンは...変です。 –