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