【ITニュース解説】Comparing Virtual Threads vs Platform Threads in Spring Boot using JMeter Load Test

2025年09月10日に「Reddit /r/programming」が公開したITニュース「Comparing Virtual Threads vs Platform Threads in Spring Boot using JMeter Load Test」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Spring Bootで仮想スレッドとプラットフォームスレッドを性能比較。IO処理が多いアプリで高負荷時、仮想スレッドは応答時間を低く保ち、スループットを維持する。一方、プラットフォームスレッドは限界で応答が悪化。CPU処理では大きな差はない。

ITニュース解説

このニュースは、現代のウェブアプリケーション開発で非常に重要になってきている「スレッド」の性能について、新しい技術と従来の技術を比較検証した興味深い結果を報告している。システムエンジニアを目指す上で、アプリケーションの性能を左右するスレッドの仕組みを理解することは欠かせない。ここでは、Spring BootというJavaのウェブアプリケーション開発で広く使われるフレームワークを例に、「仮想スレッド」と「プラットフォームスレッド」という2種類のスレッドの性能がどのように違うのかが、具体的な負荷テストを通じて検証されている。

まず、スレッドとは何かという基本的な部分から説明する。アプリケーションが何らかの処理を行う際、その処理を実行する単位がスレッドである。例えば、ウェブサイトにアクセスして情報を表示したり、ボタンをクリックしてデータを送信したりする時、裏側ではスレッドがそのリクエストを受け取って処理を進めている。従来の「プラットフォームスレッド」は、OS(オペレーティングシステム)が管理する比較的重いリソースであり、数には限りがある。ウェブサーバーであるTomcatのようなアプリケーションサーバーは、このプラットフォームスレッドを一定数プールしておき、リクエストが来るとプールからスレッドを割り当てて処理を実行する。プール内のスレッドが全て使われている状態では、新しいリクエストはスレッドが空くまで待たされることになる。これが、応答時間の悪化やシステム全体の性能低下に直結する。

ニュース記事では、このプラットフォームスレッドの限界が明確に示されている。検証では、Tomcatが持つスレッドプールの限界である約200に達すると、リクエストに対する応答時間が徐々に悪化し始めたという。これは、ウェブサイトに同時にアクセスするユーザーが増え、サーバーが処理しきれなくなった状況を想像すると分かりやすい。多くのユーザーが待たされるため、快適な利用体験が損なわれる。

そこで登場するのが、Java 21で導入された「仮想スレッド」である。仮想スレッドは、プラットフォームスレッドとは異なり、OSではなくJavaの仮想マシン(JVM)が管理する非常に軽量なスレッドだ。この軽量さのおかげで、仮想スレッドはプラットフォームスレッドに比べてはるかに大量に、そして効率的に作成・管理できる。多数のリクエストを同時に処理する必要があるウェブアプリケーションにとって、この特性は大きなメリットとなる可能性がある。仮想スレッドは、実際の処理の一部をプラットフォームスレッドに「マウント」して実行するため、あたかもOSのリソースを大量に使っているかのように見えつつも、実際には少数のプラットフォームスレッドで多くの仮想スレッドを動かせるという仕組みになっている。

今回の検証では、JMeterという負荷テストツールを使って、仮想スレッドを有効にしたSpring Bootアプリケーションと、従来のプラットフォームスレッドを使用する同じアプリケーションの二つに、同時に大量のリクエストを送っている。リクエストの量は、毎秒200ユーザーから1000ユーザー以上へと段階的に増やされている。このテストは、特に「IOベースの操作」、つまりデータベースへのアクセスや外部サービスとの通信など、処理の途中で待ち時間が発生しやすいタスクに焦点を当てて行われた。これは、サーバーが何かを「待つ」間に他の処理を進められるかどうかが、スレッドの性能に大きく影響するためだ。記事では、Thread.sleepを使って意図的に待ち時間を発生させることで、このIOベースの状況をシミュレートしている。

その結果は非常に明確だった。プラットフォームスレッドを使ったアプリケーションでは、Tomcatのスレッドプールの限界に達すると、リクエストに対する応答時間が著しく悪化し始めた。これはまさに、従来のウェブアプリケーションが大量アクセスに直面したときに発生する典型的なボトルネックだ。一方、仮想スレッドを有効にしたアプリケーションでは、非常に高い負荷がかかっても応答時間は低いままで維持され、スループット(単位時間あたりに処理できるリクエスト数)も大幅に向上した。負荷が重くなるほど、その差は顕著になったという。この結果は、仮想スレッドが、ウェブサーバーが多くのリクエストを効率的にさばくための強力なツールであることを示している。

ただし、この仮想スレッドの利点には重要な条件がある。それは、「IO集約型のリクエスト」である場合に特に効果を発揮するということだ。IO集約型とは、CPUが計算に多くの時間を費やすのではなく、データの読み書きやネットワーク通信といった「待ち時間」が大部分を占める処理を指す。仮想スレッドは、この待ち時間中に他の仮想スレッドにCPUを割り当てることで、全体のスループットを向上させる。しかし、「CPU集約型」のリクエスト、つまり複雑な計算やデータ処理など、CPUが常にフル稼働しているようなタスクにおいては、仮想スレッドはプラットフォームスレッドと同じような大きな性能向上はもたらさない。なぜなら、CPUは常に忙しく、待ち時間がないため、スレッドの切り替えによる恩恵が少ないからだ。

今回の検証結果は、Spring BootのようなJavaベースのウェブアプリケーションが、仮想スレッドの導入によって、大量の同時接続やIOが頻繁に発生する状況で、より高いパフォーマンスとスケーラビリティを実現できる可能性を示唆している。システムエンジニアにとって、アプリケーションの特性(IO集約型かCPU集約型か)を理解し、適切なスレッドモデルを選択することは、高性能なシステムを設計・構築するために不可欠な知識となるだろう。仮想スレッドは、今後のJavaアプリケーション開発において、特にマイクロサービスアーキテクチャやクラウドネイティブな環境で、より効率的なリソース利用と高い応答性を実現するための重要な基盤となることが期待される。