第9章. スレッドと同期のパフォーマンス
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
Javaの魅力のひとつは、マルチスレッドであることだ。マルチコアやマルチCPUシステムが主流になる前の時代でさえ、Javaでスレッドプログラムを簡単に書けることは、Javaの特徴の1つと考えられてきた。
性能の面では、その魅力は明らかである。2つのCPUが利用可能であれば、アプリケーションは2倍の仕事、あるいは同じ量の仕事を2倍の速さでこなせるかもしれない。Javaはアルゴリズムの部分を把握するような自動並列化言語ではないからだ。幸いなことに、今日のコンピューティングは多くの場合、離散的なタスクである。離散的なクライアントからの同時リクエストを処理するサーバ、一連のデータに対して同じ演算を実行するバッチジョブ、構成部分に分割される数学的アルゴリズムなどである。
この章では、Javaのスレッド機能と同期機能を最大限に活用する方法について説明する。
スレッドとハードウェア
第1章のマルチコアシステムとハイパースレッドシステムについての議論を思い出してほしい。ソフトウェアレベルでのスレッディングは、マシンのマルチコアとハイパースレッドを利用する利点を可能にする。
マシンのコアを2倍にすることで、正しく書かれたアプリケーションの性能を2倍にすることができるが、第1章で説明したように、CPUにハイパースレッディングを追加しても性能は2倍にならない。
例外は、ハイパースレッ ド CPU と非ハイパースレッド CPU の違いを示す最初の例である。その後、スレッドを追加することによる性能への影響をよりよく理解できるように、シングルスレッドCPUコアの観点からのみスケーリングを見ていく。ハイパースレッドCPUが重要でないと言っているわけではない。追加のハードウェアスレッドによる20%~40%の性能向上は、アプリケーションの全体的な性能やスループットを確実に向上させる。Javaの観点からは、ハイパースレッドを実際のCPUとみなし、4コア8ハイパースレッドのマシンで動作するアプリケーションを、あたかも8つのCPUがあるかのようにチューニングすべきである。しかし、計測の観点からは、シングルコアと比べて5~6倍の改善しか期待できないはずだ。
スレッド・プールとThreadPoolExecutor
スレッドは、Javaのカスタムコードで管理することもできるし、アプリケーションで スレッドプールを利用することもできる。Javaサーバーは通常、リクエストを処理するために1つ以上のスレッドプールという概念を中心に構築されている。サーバーへの呼び出しはそれぞれ、プールからの(潜在的に異なる)スレッドによって処理される。同様に、他のアプリケーションも、JavaのThreadPoolExecutorを使ってタスクを並列実行できる。
実際、いくつかのサーバ・フレームワークは、ThreadPoolExecutorクラスのインスタンスを使用してタスクを管理しているが、(Java APIにThreadPoolExecutorが追加されるよりも前に開発されたためか)独自のスレッド・プールを記述しているものも多い。これらの場合、プールの実装は異なるかもしれないが、基本概念は同じであり、このセクションでは両方について説明する。
スレッドプールを使用する上で重要なのは、プールのサイズを調整することが、最高のパフォーマンスを得るために重要であるということだ。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access