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
4.2k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rustのasync/awaitとスケジューラの話 / rust-async-await
Osuke
April 28, 2020
More Decks by Osuke
See All by Osuke
特許データを使ったマルチモーダルAIの検証事例@LLMProd#4
osuke
0
340
dbtを中心に据えた データ分析とプロダクト開発
osuke
1
1.2k
LayerX Privacy Tech事業部紹介 Tech編
osuke
2
260
(SCIS2021) Anonify: プライバシーを保護した 検証可能な状態遷移モジュール
osuke
1
460
Rustで実装された AWS Nitro Enclaves CLIを読む
osuke
0
430
Rustのパフォーマンスに関するTips
osuke
4
4.9k
ARM TrustZone入門 / ARM TrustZone intro
osuke
25
10k
Anonify
osuke
3
1.2k
Privacy on Blockchain
osuke
1
1.3k
Other Decks in Programming
See All in Programming
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
えっ!!コードを読まずに開発を!?
hananouchi
0
230
継続モナドとリアクティブプログラミング
yukikurage
3
630
AIが無かった頃の素敵な出会いの話
codmoninc
1
200
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
520
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.3k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
330
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
620
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
Leo the Paperboy
mayatellez
8
1.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
KATA
mclloyd
PRO
35
15k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Designing for Performance
lara
611
70k
Building Applications with DynamoDB
mza
96
7.1k
Building an army of robots
kneath
306
46k
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