Slide 1

Slide 1 text

の と スケジューラの話

Slide 2

Slide 2 text

About Me ● ● ブロックチェーン技術を軸にプライバシー保護やインターオペラビリティなど の研究開発 @zoom_zoomzo Osuke

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

LayerXでのRustの使い方 ● 暗号プロトコル ○ 安全性がクリティカル ○ ライブラリが充実 ● システムプログラミング言語として ○ プロセッサレベルのメモリ保護機能 の利用 ● などを用いてサーバーサイド開発

Slide 5

Slide 5 text

OSS in Rust ● ゼロ知識証明ベース ○ ○ ○ ●

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

std::future::future ● ステートマシンの抽象化インターフェース ○ 将来的に値が確定する計算 ● ポーリングモデル(繰り返し )で状態をできるだ け進めていく ● すると か を返す ○ の場合は次の状態へ遷移 ○ の場合は現在の状態のまま

Slide 9

Slide 9 text

std::task::Context Pending ● 次回はどのタイミングでポーリングすればいいのか問題 ○ が返ってきてすぐまたポーリングするの は 時間の無駄 ● ( の )でステートマシンの状態遷移が 再開可能になるタイミングの通知を設定 ● ナイーブな例 ○ ■ の場合、スレッドをブロック ○ ■ 時に、スレッドのブロックを解除 Ready

Slide 10

Slide 10 text

example

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

async/await ● 非同期関数内で まで状態を進めていく ○ を繰り返し実行していく ● 非同期処理を同期処理のように扱えるシンタックス

Slide 13

Slide 13 text

async/await ● 非同期関数は (再開可能 な計算)のシンタックスシュガー ● 非同期関数もステートマシン

Slide 14

Slide 14 text

● 軽量な実行単位 ○ メモリ消費量・時間コストが スレッドよりも圧倒 的に効率的 ● ( スレッドではなく)グリーンスレッド ○ ○ ○ ● それぞれのタスクが独立したステートマシン ○ で生成 ● それぞれの が を持つ ○ non-blockingであることが重要 Task でタスクアロケーションの効率化

Slide 15

Slide 15 text

Runtime ● 非同期計算の実行環境 ● に渡さないとランタイムで実行されない ○ はシステムプログラミング言語として薄く するため言語仕様には組み込まれていない ○ や が有名 ● がそれぞれの スレッドで実行する をいい感じに配置 ○ 公平なスケジューリング ○ がプリエンプションしない

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Scheduler ● 単位の実行をよりパフォーマンスが出るように管理 ● などでタスク実行キューをロードバランシング ○ だと 取得時の競合でパフォーマンス低下する Task Task Task Task Task exec Task exec

Slide 18

Slide 18 text

Blocking Call ● 非同期タスクはすぐに計算が完了することが期待されている ● タスクの移動は したところでのみ起こるので、そのポイントにたどり着くまでに 多くの時間を要する場合は他のタスク実行を妨げる可能性がある ● 非同期関数内でブロッキングするタスクの呼び出しは大幅なパフォーマンス低下の 懸念 ○ 時間のかかるシステムコールの呼び出しなど

Slide 19

Slide 19 text

Pollute runtime... ● ブロッキングタスクが同じスレッドで実行される非同期タスクもブロックしてしまう ● ランタイム全体のパフォーマンス低下につながる Task Task Task Task Task exec Task exec

Slide 20

Slide 20 text

Blocking Calls in tokio ● によってブロッキングな呼び出しはバックグラウンドのブロッキン グスレッドへ ● 非同期タスクはブロッキングコールの影響を回避 ● グローバルなスレッドプールなので なライフタイムを持つ必要がある ● の代わりに を使うと、現在のスレッドがブロッキ ングスレッドになる ○ トレイトを要求しない

Slide 21

Slide 21 text

● ブロッキングする可能性のある呼び出し ○ システムコール ■ ■ ○ バウンドな重い処理 ○ 外部クレート依存関数の呼び出し ○ 他のタスクと同期する必要がある処理 ○ ● 開発者が呼び出す関数が かどうか考慮しバックグラウンドのブロッキング スレッドへ送る必要がある blocking?

Slide 22

Slide 22 text

gorourtine ● スレッド ○ ブロッキングしている処理を検出 ■ 開発者は明示的にブロッキングタスクを処理する必要はない ○ の検出や実行時間の長いタスクのプリエンプションにより、ブロッ キングタスクを他の実行キュー グローバルキューにエンキュー Task Task Task Task Task exec Task exec sysmon

Slide 23

Slide 23 text

と の ブロッキング呼び出しに対する対応

Slide 24

Slide 24 text

async-std ● 標準ライブラリに かつハイパフォーマンスな非同期処理イン ターフェースを提供 ● とは違う独自の非同期ランタイムも提供 ● エコシステム ○ ○ ○

Slide 25

Slide 25 text

async-stdの新しいスケジューラの試み ● 時間がかかっているブロッキングな呼び出しをバックグラウンドのスレッドプールへ 自動的に逃す ○ 実装を見ると少なくとも ごとに 関数を呼び 出す ● 以下のような非同期関数内での時間のかかる呼び出しもスケジューラが暗黙的に ブロッキングスレッドで処理する ○ 開発者がブロッキングコールを意識しなくてよくなる

Slide 26

Slide 26 text

ランタイム実行のループ内で スレッド生成を行う関数を 呼び出す スレッド タスク実行キュー 処理時間が長いタスクを検出し て新しいスレッドプールへ逃す 部分

Slide 27

Slide 27 text

Auto-detecting blocking calls

Slide 28

Slide 28 text

Benchmark https://async.rs/blog/stop-worrying-about-blocking-t he-new-async-std-runtime/

Slide 29

Slide 29 text

● やっていき ● 厳しみ ● 一部だけマージ だが、しかし。

Slide 30

Slide 30 text

tokio ● 「 」 ● プリエンプション:同じタスクを長時間実行し続けてる状態に対する割り込み処理で タスクをスケジューリング ○ には存在しない ○ 代わりに、 で が追加 ● :タスクごとのオペレーションの上限カウンタ ○ オペレーション: ○ タスクが一定数以上 のオペレーションを行うと自動で ○ タスクがスイッチしたら カウンタはリセット ● あくまで 対策なので、 は依然必要

Slide 31

Slide 31 text

まとめ ● も 関数も もステートマシン ○ や などのランタイム上で状態遷移 ○ は軽量かつ であることがパフォーマンス上重要 ● 非同期関数内のブロッキングな呼び出しは今後も開発者が明示的に対処する 必要あり

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

We are hiring!! ● 全ての経済活動をデジタル化していく仲間を募集しています! https://www.wantedly.com/projects/363053