2016-04-26 12 views
1

私たちはJava 7を使用しており、マルチスレッドのデータ処理アプリケーションで作業しています。特定の制約のために、私たちはこの問題を解決するためにsparkやその他のmap-reduceを使用していません。このプロジェクトのアイデアは、マルチスレッドを使用したアプリケーションのパフォーマンスを最大化することです。Javaスレッドの数>コア数とガベージコレクション

私は、CPUがOSとは別のものを実行しているわけではないので、同時に動作するスレッドの数はCPUが提供するハイパースレッディングの数に等しいと考えています。しかし、Java GCがありますが、これはいつもキックインします。それも考慮する必要があります。

また、スレッドをさらに作成すると、コンテキスト切り替えに費やされる時間のために実際にパフォーマンスが低下することにご注意ください。

問題は、これらのすべてを考慮して適切な数のスレッドを作成する最良の方法です。任意のアイデアや思考プロセス?私が検討すべき他のプロセスはありますか?

答えて

3

質問は、私はあなたのためにこれを行うのJava 8を使用することになり、すべてのこれらの事を考えるとスレッド

の適切な数を作成するための最良の方法だろうものです。例えば

Results result = listOfWork.parallelStream() 
          .map(t -> t.doWork()) 
          .collect(Collectors.reduce(.....)); 

Java 7で動作している場合は、ExecutorServiceを使用できます。

int procs = Runtime.getRuntime().availableProcessors(); 
ExecutorService es = Executors.newFixedThreadPool(procs); 

しかし、キックインするすべての今して

JavaのGCはありますが、CMSを使用していない限り、それは同時にでキックしませんので、それはdoesnのこれらのスレッドが何をしているのか(スレッドプールのチューニングに関して)

私は考慮すべき他のプロセスはありますか?

CPUを使用するマシン上に他のプロセスがある場合は、それらを考慮する必要があります。

+2

いいえ、fork-joinフレームワークはJava 7では利用できません。 –

+0

@SleimanJneidi fork-joinは利用できますが、正しく使用するには苦労します。もしあなたがFork-Joinを使いたいなら、これを行うJava 8を使うことを強くお勧めします。つまり、あなたが何をしているのか本当に分かっていなければ、直接使用しないでください。例えばfork-joinで行列乗算を行いたい場合は、Doug Leaの実装をコピーしてください。 –

+2

これは本当ですが、fixedThreadPoolよりスケーラビリティがあります。 –

0

私はこの最後の学期に実際に研究しました。スレッドを使用する場合、CPUバウンドプロセスのパフォーマンスを向上させるためには、ハイパースレッドシステムの場合を除き、同じ数のスレッドをコアとして使用するのがよいでしょう。その場合は、2倍のコアを使用する必要があります。結論付けることのできるもう1つの経験則は、I/Oバウンドプロセスです。このルールは、コアあたりのスレッド数を4倍にすることができるハイパースレッドシステムの場合を除いて、コアあたりのスレッド数を4倍にすることです。

関連する問題