Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Virtual Threadsで実現する性能改善
Search
Toru Takahashi
June 15, 2024
1
1.2k
Virtual Threadsで実現する性能改善
JJUG CCC 2024 Springでの登壇資料です。
https://ccc2024spring.java-users.jp/
Toru Takahashi
June 15, 2024
Tweet
Share
More Decks by Toru Takahashi
See All by Toru Takahashi
私がAWS Amplifyを使う理由
tttol
1
310
AWS Community Builder流:技術情報のインプット・アウトプット戦略
tttol
1
430
Amplifyで開発・運用している 個人開発アプリ紹介
tttol
0
500
AmplifyにCDKがやってきた_プレビュー版のAmplify_Gen2を触ってみた.pdf
tttol
1
690
個人開発はAmplifyでホスティングしよう
tttol
0
680
結婚式WEB招待状をAWSリソースでサクッと自作した話
tttol
1
910
ChatGPTとCIパイプラインを利用してドキュメント作成作業を自動化した話
tttol
0
1.7k
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Cost Of JavaScript in 2023
addyosmani
45
6.7k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Rails Girls Zürich Keynote
gr2m
94
13k
Typedesign – Prime Four
hannesfritz
40
2.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Unsuck your backbone
ammeep
668
57k
Transcript
Virtual Threadsで実現する性能改善 NRIネットコム株式会社 髙橋 透 2024/06/16 JJUG CCC 2024 Spring
自己紹介 髙橋 透 NRIネットコム株式会社 AWS Community Builder (2024/03~) よくやってること: • Webアプリ開発・運用
◦ Java/SpringBoot(本業) ◦ AWS Amplify(趣味) • 居酒屋巡り ※スライドは後ほどUPします 2
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 3
2024/5/24 ChatGPTで生成
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 4
2024/5/24 ChatGPTで生成
スレッドはプログラムが処理を実行する際の単位のひとつ Application Thread 5
JavaアプリケーションはJVM上で動作します JVM Application Thread 6
JVM内のスレッドはOSスレッドとマッピングされる OS JVM Application Thread OS Thread 7
←Javaスレッド OSスレッド→ OS JVM Application Thread OS Thread 8
Javaスレッド?OSスレッド? • JVM内で生成されるスレッドはJavaスレッドと呼ばれる • Javaスレッド自身は処理を行わない • OSスレッドはOSが管理するスレッド • JavaスレッドはOSスレッドと1対1でマッピングされ、実処理はOSスレッド側で実行 される
Java Thread OS Thread 実処理は こっちでやる 処理 処理 処理 java.lang.Thread クラスで生成する 9
Javaスレッド?OSスレッド? Javaスレッド OSスレッド どこで生成されるか JVM OS 役割 Javaアプリの処理をOS スレッドと紐づける Javaアプリの処理の
実行 実行プラットフォーム 依存しない OSに依存する 10
なんで2種類のスレッドが作られるのか Javaスレッドがあるとき • Javaアプリの処理はJVM上のス レッドで実行される • JVMはどのマシンでも動作するの でプラットフォームに依存しない • Write
once, run anywhere (WORA) Javaスレッドがないとき • Javaアプリの処理はOSスレッドで 実行される • OSスレッドはOS実装に影響を受 ける。実行プラットフォームに依存 する。 11
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 12
2024/5/24 ChatGPTで生成
スレッドの中では様々な処理が実行される Thread 処理A IO処理 処理B 13
IO待ちが発生するとスレッドは待たされる Thread 処理A IO処理 処理B IO待ち 発生 14
非同期処理・マルチスレッド等で解消? Thread 処理A IO処理 処理B IO待ち 発生 非同期処理? マルチスレッド? 15
Thread 処理A IO処理 処理B IO待ち 発生 非同期処理? マルチスレッド? Virtual Threadsで
解決しよう! 16
• Java 21でGAした機能 • JVM内で生成される仮想的なスレッドのこと • 従来のスレッドに比べてスループットが大きく向上する Virtual Threadsとは 17
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
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1
OS Thread 1 19
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1
OS Thread 1 IO待ち 発生 20
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1
OS Thread 1 unmount Carrier Thread 2 OS Thread 2 別のCTに mount IO待ち 発生 21
OS Virtual Threadsの挙動 JVM Virtual Thread 1 Carrier Thread 1
OS Thread 1 IO待ち解消 Carrier Thread 2 OS Thread 2 戻って来る unmount 22
Virtual Threadsはなぜ高速なのか IO待ち時間を削減しスループットを向上させているから • IO待ちになったら別のCarrier Threadにマウントして効率よく処理をこなす • 単位時間あたりにこなす処理の量が増える 注意:Virtual Threadsはスループットを向上させているだけであって、処理そのものを高
速化しているわけではない 23
ここからちょっと余談 24
スレッドモデルの種類 25 Javaスレッド:OSスレッド 時代 グリーンスレッドモデル N:1 Java 1.0 ~ ネイティブスレッドモデル
1:1 Java 1.3 ~ M:Nモデル M:N (M>N) Java 21 ~ (Virtual Threads)
Java 1.0時代のスレッドモデル OS JVM Application Thread OS Thread 26 Thread
Thread Thread シングルコアCPU なので一個だけ
Java 1.0時代のスレッドモデル OS JVM Application Thread OS Thread 27 Thread
Thread Thread N個 1個
再掲:冒頭説明時のJavaスレッドとOSスレッド OS JVM Application Thread OS Thread 28
これは1対1 OS JVM Application Thread OS Thread 29 1個 1個
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
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個
おしながき 1. スレッドの基本 2. Virtual Threadsとは 3. Virtual Threadsの性能検証 32
2024/5/24 ChatGPTで生成
Virtual Threadsの性能検証 以下環境でサンプルアプリを作成し、Virtual Threadsの性能検証を実施する • Amazon Corretto 21 • Spring
Boot 3.2.4 33
検証1:JMeterで負荷をかけたときの比較 検証方法 • Thread.sleep(5000) で5秒スリープする処理を用意する ◦ これを処理Aとする • JMeterで処理Aを1000リクエストほどの負荷をかけた際のスループットとレイテン シを計測・比較する
※JMeter・・・負荷試験用のツール 34
Platform Thread(従来のスレッド処理) 検証イメージ図 35 Thread.sleep(5000) JMeter × 1000 request Virtual
Thread Thread.sleep(5000) × 1000 request
検証結果 36
検証結果 スループット [/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
検証2:スレッドの増え方比較 検証方法 • Thread.sleep(5000)を200回ずつPlatform ThreadとVirtual Threadで実行する • スレッド数はJConsoleで確認する 38
JConsole ? スレッド数を計測するツー ル スレッド以外にも色々モニタ リング可能 JDKと一緒にインストール されてるはず 39
検証結果 40
従来のPlatform Thread 実行した瞬間に 200スレッド増加している 41
Virtual Thread 実行した瞬間に 10スレッドだけ 増加している 42
まとめ 43
まとめ • Javaの世界ではJavaスレッドとOSスレッドが存在する • Virtual Threadsはスレッドで発生するIO待ち時間を削減する • Virtual Threadsはスループット向上が望めるが、処理高速化は望めない •
Virtual ThreadsのスレッドモデルはM:Nモデル • JMeter, JConsoleを使うことでパフォーマンスの違いを実際に確認できた 44
参考 • 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
ご清聴ありがとうございました 46