Virtual Threadsで実現する性能改善
by
Toru Takahashi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Virtual Threadsで実現する性能改善 NRIネットコム株式会社 髙橋 透 2024/06/16 JJUG CCC 2024 Spring
Slide 2
Slide 2 text
自己紹介 髙橋 透 NRIネットコム株式会社 AWS Community Builder (2024/03~) よくやってること: ● Webアプリ開発・運用 ○ Java/SpringBoot(本業) ○ AWS Amplify(趣味) ● 居酒屋巡り ※スライドは後ほどUPします 2
Slide 3
Slide 3 text
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 3 2024/5/24 ChatGPTで生成
Slide 4
Slide 4 text
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 4 2024/5/24 ChatGPTで生成
Slide 5
Slide 5 text
スレッドはプログラムが処理を実行する際の単位のひとつ Application Thread 5
Slide 6
Slide 6 text
JavaアプリケーションはJVM上で動作します JVM Application Thread 6
Slide 7
Slide 7 text
JVM内のスレッドはOSスレッドとマッピングされる OS JVM Application Thread OS Thread 7
Slide 8
Slide 8 text
←Javaスレッド OSスレッド→ OS JVM Application Thread OS Thread 8
Slide 9
Slide 9 text
Javaスレッド?OSスレッド? ● JVM内で生成されるスレッドはJavaスレッドと呼ばれる ● Javaスレッド自身は処理を行わない ● OSスレッドはOSが管理するスレッド ● JavaスレッドはOSスレッドと1対1でマッピングされ、実処理はOSスレッド側で実行 される Java Thread OS Thread 実処理は こっちでやる 処理 処理 処理 java.lang.Thread クラスで生成する 9
Slide 10
Slide 10 text
Javaスレッド?OSスレッド? Javaスレッド OSスレッド どこで生成されるか JVM OS 役割 Javaアプリの処理をOS スレッドと紐づける Javaアプリの処理の 実行 実行プラットフォーム 依存しない OSに依存する 10
Slide 11
Slide 11 text
なんで2種類のスレッドが作られるのか Javaスレッドがあるとき ● Javaアプリの処理はJVM上のス レッドで実行される ● JVMはどのマシンでも動作するの でプラットフォームに依存しない ● Write once, run anywhere (WORA) Javaスレッドがないとき ● Javaアプリの処理はOSスレッドで 実行される ● OSスレッドはOS実装に影響を受 ける。実行プラットフォームに依存 する。 11
Slide 12
Slide 12 text
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 12 2024/5/24 ChatGPTで生成
Slide 13
Slide 13 text
スレッドの中では様々な処理が実行される Thread 処理A IO処理 処理B 13
Slide 14
Slide 14 text
IO待ちが発生するとスレッドは待たされる Thread 処理A IO処理 処理B IO待ち 発生 14
Slide 15
Slide 15 text
非同期処理・マルチスレッド等で解消? Thread 処理A IO処理 処理B IO待ち 発生 非同期処理? マルチスレッド? 15
Slide 16
Slide 16 text
Thread 処理A IO処理 処理B IO待ち 発生 非同期処理? マルチスレッド? Virtual Threadsで 解決しよう! 16
Slide 17
Slide 17 text
● Java 21でGAした機能 ● JVM内で生成される仮想的なスレッドのこと ● 従来のスレッドに比べてスループットが大きく向上する Virtual Threadsとは 17
Slide 18
Slide 18 text
OS Virtual Threadsの世界の登場人物 JVM Virtual Thread Carrier Thread OS Thread ● Virtual Thread ○ JVM内で作成される仮想スレッド ● Carrier Thread ○ Virtual Threadがマウントされるスレッド ○ Carrier ThreadはOSスレッドとマッピングされる ● JVMがVirtual ThreadをどのCarrierにマウントするかを判断する 18
Slide 19
Slide 19 text
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1 OS Thread 1 19
Slide 20
Slide 20 text
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1 OS Thread 1 IO待ち 発生 20
Slide 21
Slide 21 text
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1 OS Thread 1 unmount Carrier Thread 2 OS Thread 2 別のCTに mount IO待ち 発生 21
Slide 22
Slide 22 text
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1 OS Thread 1 IO待ち解消 Carrier Thread 2 OS Thread 2 戻って来る unmount 22
Slide 23
Slide 23 text
Virtual Threadsはなぜ高速なのか IO待ち時間を削減しスループットを向上させているから ● IO待ちになったら別のCarrier Threadにマウントして効率よく処理をこなす ● 単位時間あたりにこなす処理の量が増える 注意:Virtual Threadsはスループットを向上させているだけであって、処理そのものを高 速化しているわけではない 23
Slide 24
Slide 24 text
ここからちょっと余談 24
Slide 25
Slide 25 text
スレッドモデルの種類 25 Javaスレッド:OSスレッド 時代 グリーンスレッドモデル N:1 Java 1.0 ~ ネイティブスレッドモデル 1:1 Java 1.3 ~ M:Nモデル M:N (M>N) Java 21 ~ (Virtual Threads)
Slide 26
Slide 26 text
Java 1.0時代のスレッドモデル OS JVM Application Thread OS Thread 26 Thread Thread Thread シングルコアCPU なので一個だけ
Slide 27
Slide 27 text
Java 1.0時代のスレッドモデル OS JVM Application Thread OS Thread 27 Thread Thread Thread N個 1個
Slide 28
Slide 28 text
再掲:冒頭説明時のJavaスレッドとOSスレッド OS JVM Application Thread OS Thread 28
Slide 29
Slide 29 text
これは1対1 OS JVM Application Thread OS Thread 29 1個 1個
Slide 30
Slide 30 text
OS Virtual ThreadsはJVM内で大量生成可能 JVM Virtual Thread Carrier Thread OS Thread 30 Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Carrier Thread OS Thread Carrier Thread OS Thread
Slide 31
Slide 31 text
OS Virtual ThreadsとOSスレッドはM対N(M>N) JVM Virtual Thread Carrier Thread OS Thread 31 Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Virtual Thread Carrier Thread OS Thread Carrier Thread OS Thread M個 N個
Slide 32
Slide 32 text
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 32 2024/5/24 ChatGPTで生成
Slide 33
Slide 33 text
Virtual Threadsの性能検証 以下環境でサンプルアプリを作成し、Virtual Threadsの性能検証を実施する ● Amazon Corretto 21 ● Spring Boot 3.2.4 33
Slide 34
Slide 34 text
検証1:JMeterで負荷をかけたときの比較 検証方法 ● Thread.sleep(5000) で5秒スリープする処理を用意する ○ これを処理Aとする ● JMeterで処理Aを1000リクエストほどの負荷をかけた際のスループットとレイテン シを計測・比較する ※JMeter・・・負荷試験用のツール 34
Slide 35
Slide 35 text
Platform Thread(従来のスレッド処理) 検証イメージ図 35 Thread.sleep(5000) JMeter × 1000 request Virtual Thread Thread.sleep(5000) × 1000 request
Slide 36
Slide 36 text
検証結果 36
Slide 37
Slide 37 text
検証結果 スループット [/sec] 最小レイテンシ [sec] 最大レイテンシ [sec] 平均レイテンシ [sec] Platform Thread 14.6 5.001 47.520 26.216 Virtual Thread 124.8 5.000 5.133 5.006 37
Slide 38
Slide 38 text
検証2:スレッドの増え方比較 検証方法 ● Thread.sleep(5000)を200回ずつPlatform ThreadとVirtual Threadで実行する ● スレッド数はJConsoleで確認する 38
Slide 39
Slide 39 text
JConsole ? スレッド数を計測するツー ル スレッド以外にも色々モニタ リング可能 JDKと一緒にインストール されてるはず 39
Slide 40
Slide 40 text
検証結果 40
Slide 41
Slide 41 text
従来のPlatform Thread 実行した瞬間に 200スレッド増加している 41
Slide 42
Slide 42 text
Virtual Thread 実行した瞬間に 10スレッドだけ 増加している 42
Slide 43
Slide 43 text
まとめ 43
Slide 44
Slide 44 text
まとめ ● Javaの世界ではJavaスレッドとOSスレッドが存在する ● Virtual Threadsはスレッドで発生するIO待ち時間を削減する ● Virtual Threadsはスループット向上が望めるが、処理高速化は望めない ● Virtual ThreadsのスレッドモデルはM:Nモデル ● JMeter, JConsoleを使うことでパフォーマンスの違いを実際に確認できた 44
Slide 45
Slide 45 text
参考 ● Java21のVirtualThreadsに対する自分の理解 #Java - Qiita ● Javaのスレッドモデル:グリーンスレッドモデル・ネイティブスレッドモデル・M:Nモデ ル - Qiita ● Java 19の注目新機能Virtual Threadについて ~TechFeed Conference 2022講 演より | gihyo.jp ● Spring Framework 6.1 / Spring Boot 3.2 の注目機能紹介 ● Virtual Threads - 導入の背景と、効果的な使い方 - - Speaker Deck ● 【図解】はじめてでもわかるJMeterの使い方 - RAKUS Developers Blog ● JVM入門 -Javaプログラムが動く仕組み- - Speaker Deck 45
Slide 46
Slide 46 text
ご清聴ありがとうございました 46