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.3k
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
Amplify製アプリケーションにパスキー認証を導入する
tttol
1
13
私がAWS Amplifyを使う理由
tttol
1
320
AWS Community Builder流:技術情報のインプット・アウトプット戦略
tttol
1
450
Amplifyで開発・運用している 個人開発アプリ紹介
tttol
0
510
AmplifyにCDKがやってきた_プレビュー版のAmplify_Gen2を触ってみた.pdf
tttol
1
710
個人開発はAmplifyでホスティングしよう
tttol
0
710
結婚式WEB招待状をAWSリソースでサクッと自作した話
tttol
1
940
ChatGPTとCIパイプラインを利用してドキュメント作成作業を自動化した話
tttol
0
1.7k
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
427
64k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
A Philosophy of Restraint
colly
203
16k
We Have a Design System, Now What?
morganepeng
51
7.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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