Slide 1

Slide 1 text

Wasmを実行するunikenrelと
 Wasmコンパイラ
 2023/9/15 WebAssembly night #11
 @saza_ku, @ainno
 1

Slide 2

Slide 2 text

自己紹介
 @saza_ku
 ● 低レイヤ, Web, インフラ
 @ainno
 ● システムソフトウェア
 ● パケット処理
 2

Slide 3

Slide 3 text

概要


Slide 4

Slide 4 text

Wasmはブラウザを超え注目されている
 4 wasmtime browers Serverless Runtime on OS kernel-wasm and others…!

Slide 5

Slide 5 text

何をやるか
 Wasm × unikernel
 5 ポータブルな バイナリ形式 高速な実行環境 高速な Wasm の実行環境 =

Slide 6

Slide 6 text

何がアツいか


Slide 7

Slide 7 text

何がアツいか
 🔥 unikernel による Wasm の高速な実行
 
 


Slide 8

Slide 8 text

何がアツいか
 🔥 unikernel による Wasm の高速な実行
 
 🔥 WASI によって unikernel の互換性の問題を解決
 
 


Slide 9

Slide 9 text

何がアツいか
 🔥 unikernel による Wasm の高速な実行
 
 🔥 WASI によって unikernel の互換性の問題を解決
 
 🔥 unikernel を Wasm コンテナとして透過的に扱う
 
 


Slide 10

Slide 10 text

何がアツいか
 🔥 unikernel による Wasm の高速な実行
 
 🔥 WASI によって unikernel の互換性の問題を解決
 
 🔥 unikernel を Wasm コンテナとして透過的に扱う
 
 🔥 Wasm コンパイラによって WASI をカーネルに対する標準的なイ ンターフェースとして普及


Slide 11

Slide 11 text

Wasmとは
 11

Slide 12

Slide 12 text

WebAssembly (Wasm)
 ● ブラウザ上で実行可能な仮想命令セット
 ● 近年サーバー上でも実行できる Wasm ランタイムが登場
 ● C, C#, Zig, Rust, Goなど複数の言語からコンパイル可能
 12

Slide 13

Slide 13 text

WebAssemly System Interface (WASI) 
 ● Wasmにシステムのリソースへのアクセスを提供するAPIの仕様
 ○ Wasm版のシステムコール(ただし関数で提供される)
 ○ OSやブラウザの差異を吸収
 
 13

Slide 14

Slide 14 text

Wasmの何が嬉しいか?
 14 HW/Platform-independent runtimeがあれば同一バイナリがどの OS/CPUでも実行可能 Language-independent 複数の言語からコンパイルされる Safe sandbox環境で実行される Fast ネイティブに近い速度で実行可能 [1] https://webassembly.github.io/threads/core/intro/introduction.html#design-goals 仕様[1]より引用すると...

Slide 15

Slide 15 text

Wasmの何が嬉しいか?
 15 Fast Safe Runtimeにより達成される HW/Platform-independent Language-independent 仕様により達成される

Slide 16

Slide 16 text

本プロジェクトの目的
 16

Slide 17

Slide 17 text

既存のWasmランタイムの課題
 ネイティブよりは実行速度が遅いことが報告されている [2]
 [2] B. Spies and M. Mock, "An Evaluation of WebAssembly in Non-Web Environments", 2021 XLVII Latin American Computing Conference (CLEI), pp. 1-10, 2021.
 17 Native Wasmランタイム

Slide 18

Slide 18 text

目的
 18 より高速な Wasm実行環境の開発

Slide 19

Slide 19 text

アプローチ
 19

Slide 20

Slide 20 text

unikernelでWasmを実行する
 
 Wasm × unikernel
 20 ポータブルな バイナリ形式 高速な実行環境

Slide 21

Slide 21 text

unikernelとは
 21

Slide 22

Slide 22 text

unikernel とは
 1つのアプリケーションとカーネルが同時にビルドされた実行可能ファイル
 
 アプリケーションのコード カーネルのコード リンク 実行可能ファイル 22 unikernel 1つのアプリケーション →単一アドレス空間 ベアメタル/VMとして動 作するカーネル

Slide 23

Slide 23 text

unikernel は何に使えるのか?
 ● クラウドの普及 → VM 上でワークロードを動かすのが一般的に
 ○ VM 上で動かすワークロードは 1 つだけであるケースが多い
 ● 各 VM 上で動かすカーネルをより小さくし、そのワークロードに特化し たものにできないか?
 → unikernel の登場
 ハイパーバイザ VM VM Linux Linux App App ハイパーバイザ VM VM unikernel unikernel App App 軽量化・特化

Slide 24

Slide 24 text

例: サーバーレス
 クラウド クラウド

Slide 25

Slide 25 text

例: サーバーレス
 クラウド イベント HTTP リクエストなど

Slide 26

Slide 26 text

例: サーバーレス
 クラウド イベント VM Linux クラウド

Slide 27

Slide 27 text

例: サーバーレス
 クラウド イベント VM Linux App クラウド 処理

Slide 28

Slide 28 text

例: サーバーレス
 クラウド イベント VM Linux App クラウド 専用

Slide 29

Slide 29 text

例: サーバーレス
 クラウド イベント VM unikernel App クラウド unikernel の利用 → 起動の高速化   実行時間の削減   セキュリティホールの縮小

Slide 30

Slide 30 text

unikernelを使うと何が嬉しいか?
 30 実行速度が速い security面でも嬉しい 起動時間が短い メモリのフットプリントが小さい ● context switchingが不要
 ● システムコールのオーバヘッド削減 ● Attack surfaceの少なさ
 ● HyperVisorによる隔離 ● コードサイズの小ささ
 ● モジュール化された構成

Slide 31

Slide 31 text

unikernel の実行速度
 31 Simon Kuenzer, Vlad-Andrei Bădoiu, Hugo Lefeuvre, Sharan Santhanam, Alexander Jung, Gaulthier Gain, Cyril Soldani, Costin Lupu, Stefan Teodorescu, Costi Răducanu, Cristian Banu, Laurent Mathy, Răzvan Deaconescu, Costin Raiciu, and Felipe Huici. 2021. Unikraft: Fast, Specialized Unikernels the Easy Way. In 16th European Conference on Computer Systems (EuroSys). 376–394. https://doi.org/10.1145/3447786.3456248 higher is better

Slide 32

Slide 32 text

2つの開発物
 32

Slide 33

Slide 33 text

mew: Wasmを実行するunikernel
 WASIをインターフェースとするunikernel
 ● ネイティブコードにコンパイルされたWasmを実行
 ● WASIをインターフェースとする
 ● システムコールを使わない
 
 → 実行速度が速くなる
 33 mew WASI API

Slide 34

Slide 34 text

mew の設計
 mew が Wasm を実行する仕組み
 1. Wasmをネイティブなオブジェクトファイルに変換
 2. mewをコンパイル
 3. 2, 3をリンクしカーネルイメージ作成
 4. 物理マシン or 仮想マシンで実行
 ① ② ③ ④ 34

Slide 35

Slide 35 text

wasker: 独自WASI 実装を挿入するWasm コンパイラ
 Wasm binaryをホストのネイティブbinaryに変換する
 ● WASI 関数を未解決シンボルにして
 オブジェクトファイルへ変換
 ○ 生成するオブジェクトファイルは
 独自に実装したWASI関数の実装と
 リンクできる
 → 独自の WASI 実装を差し込める
 35

Slide 36

Slide 36 text

wasker を開発するに至った経緯
 ● Wasm をネイティブバイナリに変換するものはすでにある
 ● ↑ OS 依存なバイナリが出力される
 ○ WASI API の実装がすでに同梱されている
 ○ Linux、Windows のシステムコールを
 叩いている
 ○ → mew 上では動かない
 ● wasker は WASI API の実装自体はバイナリに含まず、未解決シンボ ルにする
 ○ → OS 非依存
 ○ mew のみならず、他の OS 上で Wasm を実行することが可能に


Slide 37

Slide 37 text

進捗とデモ


Slide 38

Slide 38 text

進捗
 ● mew
 ✓ タイマ
 ✓ 動的メモリ管理
 ❏ ネットワーク
 ❏ ファイルシステム
 ● wasker
 ✓ 命令のサポート
 ❏ Vector/SIMD命令除く
 ❏ テスト・デバッグ
 ❏ バイナリを小さくするための最適化


Slide 39

Slide 39 text

デモ


Slide 40

Slide 40 text

デモ


Slide 41

Slide 41 text

既存技術との比較
 41

Slide 42

Slide 42 text

既存技術との定性的比較
 42 コンテナ Wasm ランタイム mew 実行速度 △ Native以下 △ Native以下 ◎ システムコールなし 隔離性 ✕ カーネルを共有 ◯ ランタイムが保証 ◎ ハイパーバイザ による分離 起動速度 △ ◎ △ VMの起動が必要 フットプリント ◯ ◎ △

Slide 43

Slide 43 text

期待される効果
 43

Slide 44

Slide 44 text

期待される効果1:
 mew ✖ コンテナランタイム
 44

Slide 45

Slide 45 text

Wasmとコンテナランタイム
 ● Wasmをコンテナランタイム上で実行できる
 ○ containerdがWasmEdgeと
 Wasmtimeをサポート
 
 ● mewもコンテナランタイム上で実行
 できるようにすることを検討中


Slide 46

Slide 46 text

コンテナランタイムの仕組み
 46 コンテナ 高レベルランタイム 低レベルランタイム containerd-shim-runc

Slide 47

Slide 47 text

WasmEdge ✖ コンテナランタイム
 47 Wasmプログラム 高レベルランタイム Wasmランタイム containerd-shim-wasmedge ● イメージからWasmファイ ルを読み取る ● WasmEdgeインスタンス を起動

Slide 48

Slide 48 text

mew ✖ コンテナランタイム
 48 Wasmプログラム 高レベルランタイム VM containerd-shim-mew ● イメージからWasmファイルを 読み取る ● mewとWasmをリンク ● VM上でmewを起動 mew

Slide 49

Slide 49 text

Wasmコンテナとしてのmew
 49 Wasmコンテナイ メージ Wasmtime mew 🔥 unikernel を Wasm コン テナとして透過的に扱う 🔥 unikernel による Wasm の高 速な実行

Slide 50

Slide 50 text

期待される効果2:
 unikernelへの貢献
 50

Slide 51

Slide 51 text

unikernelの互換性問題の解決
 51 従来
 互換性/軽量さにトレードオフ
 ⨯ 互換性
 ✓ 実行速度
 ✓ 互換性
 ⨯ 実行速度
 mew
 WASIによる
 カーネルインターフェース
 ✓ 互換性
 ✓ 実行速度
 🔥 WASI によって unikernel の互換性の問題を解決

Slide 52

Slide 52 text

期待される効果3:
 新たなカーネルインターフェース
 としてのWASIの普及
 52

Slide 53

Slide 53 text

今までの世界
 53

Slide 54

Slide 54 text

今までの世界
 54

Slide 55

Slide 55 text

wasker が実現する世界
 55

Slide 56

Slide 56 text

wasker が実現する世界
 56

Slide 57

Slide 57 text

wasker が実現する世界
 57

Slide 58

Slide 58 text

カーネルインターフェースとしてのWASI
 ✔ 任意のカーネル上で Wasm プログラムの実行を可能にする
 ○ waskerで生成したオブジェクトファイルと
 当該カーネル上での WASI 実装を差し込めるため
 ✔ カーネルの標準的な API としてWASI を提案
 ○ 目的特化型カーネルの開発をよりカジュアルに
 58

Slide 59

Slide 59 text

カーネルインターフェースとしてのWASI
 ✔ 任意のカーネル上で Wasm プログラムの実行を可能にする
 ○ waskerで生成したオブジェクトファイルと
 当該カーネル上での WASI 実装を差し込めるため
 ✔ カーネルの標準的な API としてWASI を提案
 ○ 目的特化型カーネルの開発をよりカジュアルに
 59 🔥 Wasm コンパイラによって WASI をカーネルに
 対する標準的なインターフェースとして普及

Slide 60

Slide 60 text

まとめ
 ● mew: WASIをインターフェースとした unikernel
 ● wasker: 独自の WASI 実装を差し込む Wasm コンパイラ
 
 🔥 unikernel による Wasm の高速な実行
 🔥 WASI によって unikernel の互換性の問題を解決
 🔥 unikernel を Wasm コンテナとして透過的に扱う
 🔥 Wasm コンパイラによって WASI をカーネルに対する標準的なイ ンターフェースとして普及
 60