Slide 1

Slide 1 text

Wasmを実行するunikenrelと
 Wasmコンパイラ
 2023/10/8 情報科学若手の会
 @saza_ku・@ainno
 1

Slide 2

Slide 2 text

自己紹介
 @ saza_ku
 ● 低レイヤ, Web, インフラ
 
 @ ainno
 ● システムソフトウエア, パケット処理, CUDA…
 
 
 2023年度 IPA未踏事業として取り組んでいるプロジェクトの発表です!
 2

Slide 3

Slide 3 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 4

Slide 4 text

クラウドの登場
 ● 仮想化技術の発達 → クラウドの登場
 ● 人々が簡単に計算リソースを取得・管理できるように
 仮想化 利用

Slide 5

Slide 5 text

コンテナの登場
 ● アプリケーションと環境をパッケージング → コンテナイメージ
 ● イメージを複数の環境で展開して実行できる
 イメージをビルド push pull

Slide 6

Slide 6 text

クラウドとコンテナで便利な世界


Slide 7

Slide 7 text

既存のクラウド・コンテナ
 環境の問題点


Slide 8

Slide 8 text

コンテナイメージのプラットフォーム依存性
 ● コンテナイメージは OS・CPU アーキテクチャをまたぐことができ ない
 ● プラットフォームごとに対応したコンテナイメージを作らなければ ならない
 Windows / x86_64 Linux / ARM64 Windows / x86_64 Linux / ARM64 それぞれのイメージを作成

Slide 9

Slide 9 text

大きな仮想化レイヤ
 VM ハイパーバイザ ホストカーネル ゲストカーネル コンテナランタイム アプリケーション ライブラリ・ランタイム ● VMとコンテナの二重の仮想化
 ● 大きくなる仮想化オーバーヘッド
 ● もっと仮想化レイヤを軽量化し
 最適化された実行環境を作りたい


Slide 10

Slide 10 text

もっとクラウド環境を最適化したい


Slide 11

Slide 11 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

WebAssembly 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 によるアプローチ
 ● コンテナイメージの代わりに Wasm バイナリを持ち運ぶ
 ● プラットフォームをまたいで実行できる
 Windows / x86_64 Linux / ARM64 単一の Wasm バイナリが どこにでも持ち運べる

Slide 16

Slide 16 text

Wasmとコンテナランタイム
 ● Wasmをコンテナランタイム上で実行できる
 ○ containerdがWasmEdgeと
 Wasmtimeをサポート
 ● Wasm を既存のコンテナ
 オーケストレーションツールの
 エコシステムに載せる
 


Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 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. 
 19 Native Wasmランタイム 数値計算ベンチマークの実行時間 (lower is better)

Slide 20

Slide 20 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

普通のOSでアプリケーションを動かすとき
 22 仮想アドレス空間 1 仮想アドレス空間 2 仮想アドレス空間 3 プロセス 1 プロセス 2 プロセス 3 カーネル カーネル カーネル ディスク 実行可能 ファイル 普通のOSでアプリケーションを動かすとき


Slide 23

Slide 23 text

unikernelでアプリケーションを動かすとき
 23 メモリ カーネル + アプリケーション カーネルのビルド時に アプリケーションとリンクされている unikernelでアプリケーションを動かすとき


Slide 24

Slide 24 text

unikernel によるアプローチ
 ● クラウドの普及 → VM 上でワークロードを動かすのが一般的に
 ● カーネルをより小さくし、そのワークロードに特化させたい
 → unikernel の登場
 ハイパーバイザ VM VM Linux Linux App App ハイパーバイザ VM VM unikernel unikernel App App 軽量化・特化

Slide 25

Slide 25 text

仮想化レイヤの軽量化
 VM ハイパーバイザ ホストカーネル ゲストカーネル コンテナランタイム アプリケーション ライブラリ・ランタイム VM ハイパーバイザ ホストカーネル unikernel アプリケーション

Slide 26

Slide 26 text

仮想化レイヤの軽量化
 VM ハイパーバイザ ホストカーネル ゲストカーネル コンテナランタイム アプリケーション ライブラリ・ランタイム VM ハイパーバイザ ホストカーネル unikernel アプリケーション 起動の高速化 実行時間の削減 セキュリティホールの縮小

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

unikernel の性能
 28 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

Slide 29

Slide 29 text

unikernelの課題
 29 運用のつらさ
 互換性
 アプリケーションの移植が必要
 独自のビルドシステム
 手元でカーネルごとビルド
 煩雑なデプロイ
 ディスクイメージを作ってカーネルをブートして...


Slide 30

Slide 30 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 31

Slide 31 text

アプローチ
 Wasmをunikernel上で実行できるようにし 
 コンテナランタイムを介して動かす
 31 Wasm 󰢐 ポータビリティ 󰢄 実行環境の遅さ unikernel 󰢐 軽量なカーネル 󰢄 運用のつらさ

Slide 32

Slide 32 text

アプローチ
 32 あたかもコンテナとして振る 舞う VM unikernel

Slide 33

Slide 33 text

アプローチ
 33 unikernel 󰢄 互換性 󰢄 独自のビルドシステム 󰢄 複雑なデプロイ 👈 WASIによる互換性
 👈 コンテナとして
 透過的に扱う
 Wasm 󰢄 実行環境の遅さ 👈 unikernelとして動かす


Slide 34

Slide 34 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 35

Slide 35 text

mew: Wasmを実行するunikernel
 ● Wasm にビルドされたアプリケーションを実行する
 ● mewはAPIとしてWASIを提供する
 35 Hypervisor mew mew アプリケーションを Wasm にビルド

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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


Slide 40

Slide 40 text

mew ✖ コンテナランタイム
 40 Wasmプログラム 高レベルランタイム VM containerd-shim-mew ● Wasmを読み取る ● waskerでコンパイル ● mewとwaskerの生成物をリンク ● VM上でmewを起動 mew

Slide 41

Slide 41 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 42

Slide 42 text

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


Slide 43

Slide 43 text

デモ


Slide 44

Slide 44 text

デモ


Slide 45

Slide 45 text

デモの内容
 mew Wasm カーネルの初期化

Slide 46

Slide 46 text

デモの内容
 mew Wasm 実行

Slide 47

Slide 47 text

デモの内容
 mew Wasm フィボナッチ数 の計算

Slide 48

Slide 48 text

デモの内容
 mew Wasm print_int()

Slide 49

Slide 49 text

デモの内容
 mew Wasm 結果を表示

Slide 50

Slide 50 text

unikernel: mew
 ● Zig で開発中
 ● メモリ管理
 ○ Newlib の malloc
 ■ 組み込み向けのベアメタル環境で動く libc
 ● ネットワーク
 ○ virtio-net
 ○ lwIP (light weight IP)
 ■ 組み込み向けの TCP/IP プロトコルスタックの実装
 ● ファイルシステム
 ○ FAT32
 ○ とりあえず Read Only?


Slide 51

Slide 51 text

メモリ管理
 ● カーネルが使う領域と Wasm が使う領域を別々に管理する
 ○ アドレス空間が一つしかないので
 ちょっと工夫する必要がある
 ○ それぞれ異なるアドレスにマップ
 ● Wasm のメモリは 64KiB ごとに管理
 ○ カーネル内でも 64KiB ごとに管理
 ● 割り当てた領域は Wasm、Newlib に
 管理してもらう
 0xffff800000000000 0xffffc00000000000 ・・ ・ 64KiB ・・ ・ Wasmが使う Newlib が使う

Slide 52

Slide 52 text

Wasm コンパイラ: wasker
 ● RustとLLVMで開発中
 ● WasmのLLVMフロントエンドを書いている(Wasm to LLVM IR)
 ● LLVM IRの表現力 > Wasmの表現力なので, 割と書きやすい
 ○ 2k行くらいで動いている


Slide 53

Slide 53 text

CI
 ● GitHub Actions 上で QEMU を動作して E2E テストを実行
 ● mew から期待する出力が得られたら pass
 ● reusable workflow にすることで mew、wasker 両方から実行


Slide 54

Slide 54 text

CI
 ● QEMU の標準出力を
 ファイルに出力
 ● そのファイルに対して
 期待する出力文字列で
 grep する


Slide 55

Slide 55 text

目次
 ● クラウドとコンテナの現状
 ● Wasmによるアプローチと問題点
 ● unikernelによるアプローチと問題点
 ● アプローチ
 ● 3つの開発物
 ● デモ・実装
 ● 貢献


Slide 56

Slide 56 text

貢献1:
 unikernelをコンテナとして
 扱いやすくする
 56

Slide 57

Slide 57 text

Wasmコンテナとしてのmew
 57 Wasmコンテナイ メージ Wasmtime mew 🔥 unikernel を Wasm コンテナとして透過 的に扱う

Slide 58

Slide 58 text

貢献2:
 unikernelの互換性問題を解決
 58

Slide 59

Slide 59 text

unikernel の歴史: 2013~2016
 ● この頃の unikernel は独自の API を持っていた
 → 既存のアプリケーションは移植が必要
 新規のアプリケーションもその API で開発
 
 ● 例えば
 ○ MirageOS → OCaml しか動かない
 ○ IncludeOS → C++ しか動かない
 59

Slide 60

Slide 60 text

unikernel の歴史: 2016~現在
 ● 「じゃあ Linux 向けのバイナリを動かそう!」
 → Linux バイナリ互換 unikernel の登場
 
 ● 様々な実装
 ○ OSv
 ○ HermiTux
 ○ Unikraft
 60

Slide 61

Slide 61 text

unikernel の歴史: 2016~現在
 ● Linux バイナリ互換ということは、
 システムコールを実装しなければならない
 → つらい(再リンク・バイナリ書き換え..)
 
 ● Linux との互換性を追求し続けなければならない
 → つらい(unikernel の機能の小ささが犠牲に)
 
 unikernel の軽量さが損なわれてしまった...
 61

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

貢献3:
 高速なWasm実行環境
 63

Slide 64

Slide 64 text

既存のWasmランタイムとの比較
 Wasmランタイム カーネル mew WASI WASI システムコール Hypervisor

Slide 65

Slide 65 text

貢献4:
 新たなカーネルインターフェース
 としてのWASIの普及
 65

Slide 66

Slide 66 text

今までの世界
 66

Slide 67

Slide 67 text

今までの世界
 67

Slide 68

Slide 68 text

wasker が実現する世界
 68

Slide 69

Slide 69 text

wasker が実現する世界
 69

Slide 70

Slide 70 text

wasker が実現する世界
 70

Slide 71

Slide 71 text

wasker が実現する世界
 71 🔥 Wasm コンパイラによって WASI をカーネルに
 対する標準的なインターフェースとして普及

Slide 72

Slide 72 text

まとめ
 ● クラウドの仮想化環境を最適化したい
 ● Wasmを実行するunikernelを開発する
 ● unikernelをコンテナとして動かす
 ● → Wasm がより高速に動作する
 ● → unikernel を扱いやすくする
 ● カーネルの API としての WASI を普及させる
 
 72