4

私は(終日)タスクを並行して実行する(実行するタスクにI / Oがない)プログラムを持っているので、それExecutors.newFixedThreadPool(poolSize)を実装するために使用しました。

最初は を に設定しpoolSizeましRuntime.getRuntime().availableProcessors()たが、同じ PC (32 コア) で他のプロセスが実行されているため、利用可能なすべてのコアを使用するのが少し心配でした。

特に、同じプログラムを (異なる入力データで) 実行している他の 10 個の JVM があるため、使用可能なコア間でスレッドを切り替えるという点で多くのオーバーヘッドが発生し、全体的な計算が遅くなる可能性があるのではないかと少し心配しています。 .

各プログラム/JVM のプールのサイズはどのように決定すればよいですか?

また、私の PC では、他のプロセス (ウイルス対策、バックアップなど) が常に実行されています。これらも考慮に入れましょうか。

4

4 に答える 4

1

どんなアドバイスも、あなたの特定の状況に依存するでしょう。32 コアの 10 個の JVM は、それぞれ 3 つのスレッドを提案します (ガベージ コレクション スレッド、タイマー タスクなどを無視します...)

他のタスクも実行しています。スケジューラはそれらが実行されていることを確認しますが、応答性が必要ですか? JVM よりも応答性が高い? Linux/Unix を実行している場合は、nice特定のプロセスが CPU を占有しないようにするために ( を介して) 優先順位付けを利用することもできます。

最後に、10 個の JVM を実行しています。それはページングを引き起こしますか?その場合、速度が低下するため、大量のメモリを消費しないようにするために、実行する JVM の数を減らした方がよい場合があります。

主要な変数が公開され、構成可能であることを確認し、最適なシナリオを見つけるためにさまざまなシナリオを測定してください。

于 2013-01-14T17:26:04.323 に答える
1

各プログラム/JVM のプールのサイズはどのように決定すればよいですか?

使用率が 99% に近づき、それ以上になるスレッド数が必要です。

作業のバランスをとる最も簡単な方法は、プロセスを 1 回実行し、複数のファイルを同時に処理し、1 つのスレッド プールのみを使用することです。コマンドラインからファイルを開始する必要がある場合は、プロセスをサービスとして設定できます。

何らかの理由でこれが不可能な場合は、スレッド プールをどれだけ縮小するかを推測する必要があります。1 つのプロセスを実行してみて、使用率を確認してください。1 つが 40% である場合、10 個のプロセスが 400% 使用されていると思われます。つまり、プール サイズを 4 分の 1 に減らすことができます。

于 2013-01-14T17:26:08.363 に答える
0

プロセスを grep してみて、トップ/タスク マネージャーとパフォーマンス モニターをチェックして、この実装が実際にマシンに影響を与えているかどうかを確認してください。

この記事には、実装しようとしているものに関する興味深い情報が含まれているようです: http://www.ibm.com/developerworks/library/j-jtp0730/index.html

于 2013-01-15T11:49:25.110 に答える
0

残念ながら、プログラムは通常、同じボックスで他に何が起こっているのか、または何が起こっているのかを知らないため、これを知るのは難しいことです.

「簡単な」解決策は、プール サイズを構成可能にすることです。これにより、プログラム/ボックスを制御するユーザーは、プログラムに割り当てるスレッドの数を決定できます (おそらく、ボックスの一般的なワークロードに関する知識を使用して)。

より複雑な解決策は、ボックスの現在のワークロードをプログラムで判断し、そこから適切なプール サイズを選択することです。このソリューションの有効性は、ワークロードをどれだけ正確に判断できるか、時間の経過とともに変化する可能性があるかどうかにかかっています。

于 2013-01-14T17:26:34.837 に答える