2

Javaを使用して32個の仮想プロセッサを搭載したサーバーでWebクロールを実行しています。どうすればこれらのプロセッサでいっぱいにできますか?マルチスレッドプログラミングに関するいくつかの提案を見てきましたが、シングルプロセッサマシンでもマルチスレッドプログラミングを実行できるため、すべてのプロセッサを確実に活用できるのではないかと思います。

4

3 に答える 3

5

これに対する簡単な答えはありません...すべてのプロセッサが使用されていることを確認する方法が正しい方法でマルチスレッドを使用することを除いて。(注:それは循環的な答えです!)

基本的に、複数のプロセッサを効果的に使用する方法は次のとおりです。

  • 並行して実行できる作業があることを確認し、
  • 別のスレッドが何かをしている間、あるスレッドを強制的に待機させる競合ポイントを減らす/排除します。

単純な計算を行う場合、これは十分に困難です。Webクローラーの場合、スレッドがネットワークをめぐって競合し、(おそらく)サーバーの帯域幅を削除するという追加の問題があり、通常、スレッドは結果を共有データ構造またはデータベースに入れようとします。

これが、このレベルの一般性で言えることのすべてです...


そして、@ veerが正しく指しているように、それを「保証」することはできません。


...しかし、すべての悲惨なネットワーク遅延が並行して発生するため、スレッドの負荷を使用すると、壁時間的には確実に高速になります...

実際、船外に出ると、スレッドの負荷が競合のためにスループットを低下させる可能性があります。問題にたくさんのスレッドを投げるだけでは、めったに良い考えではありません。

于 2012-08-19T05:37:36.817 に答える
0

コンピュータまたはプログラムは、その処理チェーンの中で最も遅いリンクと同じくらい高速です。CPU容量を増やすだけでは、劇的なパフォーマンスのピークは保証されません。キャッシュサイズ、RAMなどの他の問題は別として、すべてのプロセッサを活用する方法についての質問には、2つの基本的なアプローチがあります。

[1] Java/.NETなどのJit/ジャストインタイムコンパイラ/インタプリタテクノロジを使用する。Javaについてはよくわかりませんが、.NETジッターは、mahcineで使用可能なすべてのプロセッサーを利用するように設計されています。実際、この機能により、C / C ++などの他の静的言語コンパイラに対してジッターが目立つようになります。ジッターは32プロセッサ上にあることを「認識」しているため、プログラムよりもジッターを利用するのにはるかに適しています。他のマシンで静的にコンパイルされます。(堅牢なマルチスレッドコードを記述している場合に限ります!)

[2] C /C++でのプログラミング。これは古典的なアプローチです。32個のCPUを搭載した同じマシンでコードをコンパイルし、メモリ管理やポインタの処理などのプログラムに適切な注意を払うと、C / C ++プログラムが最適になり、CLR/JVMよりもパフォーマンスが向上します。対応するもの(ガベージコレクターまたはVMの余分なオーバーヘッドなしで実行されるため)。

ただし、堅牢なコードの記述は、C /C++よりも.NET/Javaの方がはるかに簡単であることに注意してください。したがって、「ハードコア」プログラマーでない場合は、前者のアプローチを使用することをお勧めします。また、複数のスレッドが同じ変数を変更しようとしたときに変数をロックするなど、複数のスレッドを慎重に処理することを忘れないでください。ただし、変数が予期しない動作をする場合、過度のロックによってコードがハングする可能性があります。

于 2012-08-19T06:03:52.527 に答える
0

プロセッサ管理は、使用している仮想マシン、つまりJVMを介してネイティブに実装されます。Java Hotspot VMを使用している場合は、ここでJavaHotspotVMオプションを参照してマシンを最適化できます。サードパーティのVMを使用している場合は、プロバイダーが要件に合わせてVMを調整するのを支援する場合があります。

設計におけるアプリケーションのパフォーマンスは、実際にはあなた次第です。アプリケーションを最適化するためにスレッドとメモリ使用量を監視する場合は、現在利用可能な任意のVM監視ツールを使用できます。Java仮想マシン(JVM)には、JMXを使用して監視および管理できるインストルメンテーションが組み込まれています。詳細については、JMXを使用したプラットフォームの監視と管理を確認できます。サードパーティのVMの場合は、ベンダーに連絡する必要があると思います。

于 2012-08-19T06:37:40.797 に答える