Slide 1

Slide 1 text

次世代のクラウドネイティブ基盤
 Wasmの今と未来
 CloudNative Days Summer 2024 @札幌
 2024/06/15
 
 Soichiro Ueda, Ai Nozaki 
 1

Slide 2

Slide 2 text

2 上田 蒼一朗 京都大学 岡部研究室 M1 ❤ インフラ技術、システムソフトウェア 野崎 愛 東京大学 中村・高瀬研究室 M2 ❤ ハードウェアとソフトウェアの境界 saza-ku saza_ku ainozaki ainno321

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

目次
 4 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来

Slide 5

Slide 5 text

WebAssemblyとは
 ● ブラウザ上で実行可能な仮想命令セットアーキテクチャ
 ○ JavaScriptと違ってバイナリの状態で実行
 ● Wasmランタイムを用いてサーバー上でも実行可能
 ● 間違われがちなこと
 ○ 正式な略記はWASMではなく
 Wasm
 ○ アセンブリではない
 5

Slide 6

Slide 6 text

Wasm × クラウドネイティブ?
 「コンテナの次はWasmだ!」
 「DockerやKubernetesがWasmをサポート!」
 「WasmがあったらDockerは作らなかった!」
 6

Slide 7

Slide 7 text

VS ✅ ポータビリティ ✅ セキュリティ ✅ 軽量 7

Slide 8

Slide 8 text

Wasmの仕組み
 8 Wasmランタイム

Slide 9

Slide 9 text

Wasmランタイムのお仕事
 ● Wasmバイナリを解釈し、実行する
 ○ インタプリタ型・JIT型・AoTコンパイル型
 
 ● Wasmとシステムの仲介役
 ○ サンドボックスの提供
 ○ システムに対するAPI(WASI)の提供
 9

Slide 10

Slide 10 text

Wasmのバイナリを眺めてみよう
 10

Slide 11

Slide 11 text

これがWasmだ!
 11 ↑ WebAssemblyのテキスト形式(WAT)

Slide 12

Slide 12 text

12 Wasmの実行単位、モジュール この中に一連の実行対象となる命令が記述されている 実行可能ファイルみたいなイメージ

Slide 13

Slide 13 text

13 実行対象となる命令列 命令列は関数の単位で記述される

Slide 14

Slide 14 text

14 Wasmはスタックマシン → スタック上で計算を行う 各命令がスタックに対する操作になっている スタック

Slide 15

Slide 15 text

15 local.get $a ← 引数 $a をスタックに詰む スタック $a

Slide 16

Slide 16 text

16 local.get $b ← 引数 $b をスタックに詰む スタック $a $b

Slide 17

Slide 17 text

17 i64.add ← スタックから2つ取り出し、その和を積む スタック $a + $b

Slide 18

Slide 18 text

18 return ← 一番上に積んでいる値を返す スタック $a + $b ↓ 戻り値

Slide 19

Slide 19 text

Wasmはスタックマシンだが...
 ● ランダムアクセス可能なメモリも持っている
 ○ Linear Memory
 ● Wasmランタイムによって用意され
 要求すれば動的にサイズを変更できる
 ○ ページ単位で変更でき、1ページ = 64KiB
 19 0 64KiB

Slide 20

Slide 20 text

20 初期のページサイズを指定 i32.store ↑ スタックに積まれた値を  Linear Memoryにストアする i32.load ↑ Linear Memoryの値を  スタックに積む memory.grow ↑ Linear Memoryのサイズを変更

Slide 21

Slide 21 text

IOとかはどうするの?
 ● Wasm自体にIO等を扱う仕組みはない
 ● WebAssembly System Interface (WASI)
 ○ システムのリソースを提供するAPIの仕様
 ○ ファイル・ネットワークなど
 ● 最新のバージョンは Preview2
 ○ 2024年1月に正式リリース
 ○ WASI Preview2、WASI p2、WASI 0.2 などとも
 21

Slide 22

Slide 22 text

22 使いたいWASI関数をimportする WASI Preview1のproc_exitとfd_writeを import

Slide 23

Slide 23 text

23 importした関数を呼び出す → ランタイム側に処理が委譲される

Slide 24

Slide 24 text

24 スタック Linear Memory Wasmランタイム Read/Write

Slide 25

Slide 25 text

目次
 25 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来

Slide 26

Slide 26 text

開発者体験
 26 1どう書く? 2どう手元で動かす? 3どこでデプロイ? 4どう共有する?

Slide 27

Slide 27 text

どう書く?
 27 プログラミング言語のWasm対応 WASI p2

Slide 28

Slide 28 text

どう手元で動かす?
 28 手元で動くWasmランタイム Wasmtime, WAMR

Slide 29

Slide 29 text

どう手元で動かす?
 29 コンテナエコシステムとWasmの統合 shim shim shim

Slide 30

Slide 30 text

どこでデプロイする?
 30 Wasmをサポートするサービス

Slide 31

Slide 31 text

どう共有する?
 ● まだ成熟してない..
 ● レジストリの仕様:warg
 ○ JAF Labsによる wa.dev (public beta)
 31 https://wa.dev/ainozaki:cnds-demo

Slide 32

Slide 32 text

目次
 32 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来

Slide 33

Slide 33 text

33 Wasmで今一番アツい話題 Component Model

Slide 34

Slide 34 text

Core Wasmの課題
 外部のモジュールやプログラムとのimport/exportが不得意
 ○ Core Wasmの仕様はprimitiveな型しか持たない
 ■ その他の型は全てLinear メモリ上で表現されるが、言語依存
 ○ 😱引数のメモリ上の表現をプログラマが揃える必要
 34 ‘H’ ‘e’ ‘l’ ‘l’ ‘o’ \0 ‘H’ ‘H’ ‘e’ ‘e’ ‘l’ ‘l’ ‘l’ ‘l’ ‘o’ ‘o’ ASCII! 終端null! utf-16!

Slide 35

Slide 35 text

Component Modelの登場
 モジュールを超えて型を表現するための仕様
 
 インターフェースの記述言語 WIT
 ● Wasm Interface Type
 ● import/exportのシグネチャを定義する言語
 ○ WITを元に各言語向けのbindingコードが自動生成される(c.f gRPCのproto) 
 ○ ユーザが記述し,ユーザが呼び出す
 バイナリレベルの表現規約 Canonical ABI
 ● Application Binary Interface
 ● 型のバイナリ表現を定義
 ○ 基本ユーザからは見えない
 35

Slide 36

Slide 36 text

Component Modelの登場
 36 Component Module from 言語B WITに基づいた 呼び出し Canonical ABIによる データ表現の一貫性 Canonical ABI Module from 言語A 言語を超えたWasmのリンクを実現できる

Slide 37

Slide 37 text

例
 37 Component Module from 呼び出し

Slide 38

Slide 38 text

38 Step1: Rustによるcnds_demo componentの作成 WIT/その実装の例が 初期生成される (次スライド)

Slide 39

Slide 39 text

39 WITによる interfaceの定義 interfaceの中身の実装 初期生成されたファ イルの中身

Slide 40

Slide 40 text

40 componentのビルド wargにもpublish https://wa.dev/ainozaki:cnds-demo

Slide 41

Slide 41 text

41 Step2: JSからのcnds_demoの利用 .wasmから 自動生成 jcoにcomponentを渡す

Slide 42

Slide 42 text

42 自動生成された .jsからimport Run!

Slide 43

Slide 43 text

さいごに
 43 43 まだ議論しなければならないこともあるが魅力 的な技術 バイナリサイズの 大きさ 既存の資産からの 乗り換え 未熟な共有手段 定量的な事例評価

Slide 44

Slide 44 text

44 Thank you for your attention!

Slide 45

Slide 45 text

45 お気づきでしょうか...?

Slide 46

Slide 46 text

46

Slide 47

Slide 47 text

以下入らなかったスライド
 47

Slide 48

Slide 48 text

48 ← コンパイラにWasmバッ クエンドを追加 ← ビルド RustでWasmを作成する

Slide 49

Slide 49 text

49 Wasmランタイムで動かす

Slide 50

Slide 50 text

50 RuntimeClass 作成 Pod作成 Kubernetesから動かす containerd 設定

Slide 51

Slide 51 text

51 Mewzプロジェクトの簡単な紹介 問題:Wasmの隔離性は Multi-tenancyでは不十分 解決:Wasmに特化した軽量OS低 overheadにVMで隔離 Wasm Runtime Machine Host OS App App App 軽量OS Host OS + Hypervisor Machine App 軽量OS