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
Rustのasync/awaitとスケジューラの話 / rust-async-await
Search
Osuke
April 28, 2020
Programming
9
3.7k
Rustのasync/awaitとスケジューラの話 / rust-async-await
Osuke
April 28, 2020
Tweet
Share
More Decks by Osuke
See All by Osuke
特許データを使ったマルチモーダルAIの検証事例@LLMProd#4
osuke
0
140
dbtを中心に据えた データ分析とプロダクト開発
osuke
1
920
LayerX Privacy Tech事業部紹介 Tech編
osuke
0
140
(SCIS2021) Anonify: プライバシーを保護した 検証可能な状態遷移モジュール
osuke
1
340
Rustで実装された AWS Nitro Enclaves CLIを読む
osuke
0
310
Rustのパフォーマンスに関するTips
osuke
3
2.7k
ARM TrustZone入門 / ARM TrustZone intro
osuke
3
8k
Anonify
osuke
3
960
Privacy on Blockchain
osuke
1
1.2k
Other Decks in Programming
See All in Programming
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
subpath importsで始めるモック生活
10tera
0
320
cmp.Or に感動した
otakakot
3
210
Jakarta EE meets AI
ivargrimstad
0
620
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
200
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
120
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
630
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
[Do iOS '24] Ship your app on a Friday...and enjoy your weekend!
polpielladev
0
110
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Side Projects
sachag
452
42k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Become a Pro
speakerdeck
PRO
25
5k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Gamification - CAS2011
davidbonilla
80
5k
Transcript
の と スケジューラの話
About Me • • ブロックチェーン技術を軸にプライバシー保護やインターオペラビリティなど の研究開発 @zoom_zoomzo Osuke
None
LayerXでのRustの使い方 • 暗号プロトコル ◦ 安全性がクリティカル ◦ ライブラリが充実 • システムプログラミング言語として ◦
プロセッサレベルのメモリ保護機能 の利用 • などを用いてサーバーサイド開発
OSS in Rust • ゼロ知識証明ベース ◦ ◦ ◦ •
None
None
std::future::future • ステートマシンの抽象化インターフェース ◦ 将来的に値が確定する計算 • ポーリングモデル(繰り返し )で状態をできるだ け進めていく •
すると か を返す ◦ の場合は次の状態へ遷移 ◦ の場合は現在の状態のまま
std::task::Context Pending • 次回はどのタイミングでポーリングすればいいのか問題 ◦ が返ってきてすぐまたポーリングするの は 時間の無駄 • (
の )でステートマシンの状態遷移が 再開可能になるタイミングの通知を設定 • ナイーブな例 ◦ ▪ の場合、スレッドをブロック ◦ ▪ 時に、スレッドのブロックを解除 Ready
example
None
async/await • 非同期関数内で まで状態を進めていく ◦ を繰り返し実行していく • 非同期処理を同期処理のように扱えるシンタックス
async/await • 非同期関数は (再開可能 な計算)のシンタックスシュガー • 非同期関数もステートマシン
• 軽量な実行単位 ◦ メモリ消費量・時間コストが スレッドよりも圧倒 的に効率的 • ( スレッドではなく)グリーンスレッド ◦
◦ ◦ • それぞれのタスクが独立したステートマシン ◦ で生成 • それぞれの が を持つ ◦ non-blockingであることが重要 Task でタスクアロケーションの効率化
Runtime • 非同期計算の実行環境 • に渡さないとランタイムで実行されない ◦ はシステムプログラミング言語として薄く するため言語仕様には組み込まれていない ◦ や
が有名 • がそれぞれの スレッドで実行する をいい感じに配置 ◦ 公平なスケジューリング ◦ がプリエンプションしない
None
Scheduler • 単位の実行をよりパフォーマンスが出るように管理 • などでタスク実行キューをロードバランシング ◦ だと 取得時の競合でパフォーマンス低下する Task Task
Task Task Task exec Task exec
Blocking Call • 非同期タスクはすぐに計算が完了することが期待されている • タスクの移動は したところでのみ起こるので、そのポイントにたどり着くまでに 多くの時間を要する場合は他のタスク実行を妨げる可能性がある • 非同期関数内でブロッキングするタスクの呼び出しは大幅なパフォーマンス低下の
懸念 ◦ 時間のかかるシステムコールの呼び出しなど
Pollute runtime... • ブロッキングタスクが同じスレッドで実行される非同期タスクもブロックしてしまう • ランタイム全体のパフォーマンス低下につながる Task Task Task Task
Task exec Task exec
Blocking Calls in tokio • によってブロッキングな呼び出しはバックグラウンドのブロッキン グスレッドへ • 非同期タスクはブロッキングコールの影響を回避 •
グローバルなスレッドプールなので なライフタイムを持つ必要がある • の代わりに を使うと、現在のスレッドがブロッキ ングスレッドになる ◦ トレイトを要求しない
• ブロッキングする可能性のある呼び出し ◦ システムコール ▪ ▪ ◦ バウンドな重い処理 ◦ 外部クレート依存関数の呼び出し
◦ 他のタスクと同期する必要がある処理 ◦ • 開発者が呼び出す関数が かどうか考慮しバックグラウンドのブロッキング スレッドへ送る必要がある blocking?
gorourtine • スレッド ◦ ブロッキングしている処理を検出 ▪ 開発者は明示的にブロッキングタスクを処理する必要はない ◦ の検出や実行時間の長いタスクのプリエンプションにより、ブロッ キングタスクを他の実行キュー
グローバルキューにエンキュー Task Task Task Task Task exec Task exec sysmon
と の ブロッキング呼び出しに対する対応
async-std • 標準ライブラリに かつハイパフォーマンスな非同期処理イン ターフェースを提供 • とは違う独自の非同期ランタイムも提供 • エコシステム ◦
◦ ◦
async-stdの新しいスケジューラの試み • 時間がかかっているブロッキングな呼び出しをバックグラウンドのスレッドプールへ 自動的に逃す ◦ 実装を見ると少なくとも ごとに 関数を呼び 出す •
以下のような非同期関数内での時間のかかる呼び出しもスケジューラが暗黙的に ブロッキングスレッドで処理する ◦ 開発者がブロッキングコールを意識しなくてよくなる
ランタイム実行のループ内で スレッド生成を行う関数を 呼び出す スレッド タスク実行キュー 処理時間が長いタスクを検出し て新しいスレッドプールへ逃す 部分
Auto-detecting blocking calls
Benchmark https://async.rs/blog/stop-worrying-about-blocking-t he-new-async-std-runtime/
• やっていき • 厳しみ • 一部だけマージ だが、しかし。
tokio • 「 」 • プリエンプション:同じタスクを長時間実行し続けてる状態に対する割り込み処理で タスクをスケジューリング ◦ には存在しない ◦
代わりに、 で が追加 • :タスクごとのオペレーションの上限カウンタ ◦ オペレーション: ◦ タスクが一定数以上 のオペレーションを行うと自動で ◦ タスクがスイッチしたら カウンタはリセット • あくまで 対策なので、 は依然必要
まとめ • も 関数も もステートマシン ◦ や などのランタイム上で状態遷移 ◦ は軽量かつ
であることがパフォーマンス上重要 • 非同期関数内のブロッキングな呼び出しは今後も開発者が明示的に対処する 必要あり
None
We are hiring!! • 全ての経済活動をデジタル化していく仲間を募集しています! https://www.wantedly.com/projects/363053