Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第56回 情報科学若手の会 Wasmを実行するunikernelとWasmコンパイラ

Saza
October 09, 2023
3.6k

第56回 情報科学若手の会 Wasmを実行するunikernelとWasmコンパイラ

第56回 情報科学若手の会で発表したスライドです。

Saza

October 09, 2023
Tweet

Transcript

  1. 自己紹介
 @ saza_ku
 • 低レイヤ, Web, インフラ
 
 @ ainno


    • システムソフトウエア, パケット処理, CUDA…
 
 
 2023年度 IPA未踏事業として取り組んでいるプロジェクトの発表です!
 2
  2. 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]より引用すると...
  3. 既存の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)
  4. 普通のOSでアプリケーションを動かすとき
 22 仮想アドレス空間 1 仮想アドレス空間 2 仮想アドレス空間 3 プロセス 1

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

  5. unikernel によるアプローチ
 • クラウドの普及 → VM 上でワークロードを動かすのが一般的に
 • カーネルをより小さくし、そのワークロードに特化させたい
 →

    unikernel の登場
 ハイパーバイザ VM VM Linux Linux App App ハイパーバイザ VM VM unikernel unikernel App App 軽量化・特化
  6. unikernel の利点
 27 実行速度が速い security面でも嬉しい 起動時間が短い メモリのフットプリントが小さい • context switchingが不要


    • システムコールのオーバヘッド削減 • Attack surfaceの少なさ
 • HyperVisorによる隔離 • コードサイズの小ささ
 • モジュール化された構成
  7. 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
  8. アプローチ
 33 unikernel 󰢄 互換性 󰢄 独自のビルドシステム 󰢄 複雑なデプロイ 👈

    WASIによる互換性
 👈 コンテナとして
 透過的に扱う
 Wasm 󰢄 実行環境の遅さ 👈 unikernelとして動かす

  9. wasker: Wasm コンパイラ
 Wasm binaryをnative binaryに変換するコンパイラ
 • WASI 関数を未解決シンボルにして
 オブジェクトファイルへ変換


    • 生成するオブジェクトファイルは
 独自に実装したWASI関数の実装と
 リンクできる
 → 独自の WASI 実装を差し込める
 38
  10. wasker: 開発するに至った経緯
 • Wasm をネイティブバイナリに変換するものはすでにある
 • ↑ OS 依存なバイナリが出力される
 ◦

    Linux、Windows のシステムコールを
 叩いている
 ◦ WASI API の実装がすでに同梱されている
 ◦ → mew 上では動かない
 • wasker は WASI API の実装自体はバイナリに含まず、未解決シンボ ルにする
 ◦ → OS 非依存
 ◦ mew のみならず、他の OS 上で Wasm を実行することが可能に

  11. mew ✖ コンテナランタイム
 40 Wasmプログラム 高レベルランタイム VM containerd-shim-mew • Wasmを読み取る

    • waskerでコンパイル • mewとwaskerの生成物をリンク • VM上でmewを起動 mew
  12. 進捗
 • mew
 ✓ タイマ
 ✓ 動的メモリ管理
 ❏ ネットワーク
 ✓

    ネットワークデバイスドライバ
 ❏ ファイルシステム
 • wasker
 ✓ 命令のサポート
 ❏ Vector/SIMD命令除く
 ❏ テスト・デバッグ
 ❏ バイナリを小さくするための最適化
 • containerd-shim

  13. unikernel: mew
 • Zig で開発中
 • メモリ管理
 ◦ Newlib の

    malloc
 ▪ 組み込み向けのベアメタル環境で動く libc
 • ネットワーク
 ◦ virtio-net
 ◦ lwIP (light weight IP)
 ▪ 組み込み向けの TCP/IP プロトコルスタックの実装
 • ファイルシステム
 ◦ FAT32
 ◦ とりあえず Read Only?

  14. メモリ管理
 • カーネルが使う領域と Wasm が使う領域を別々に管理する
 ◦ アドレス空間が一つしかないので
 ちょっと工夫する必要がある
 ◦ それぞれ異なるアドレスにマップ


    • Wasm のメモリは 64KiB ごとに管理
 ◦ カーネル内でも 64KiB ごとに管理
 • 割り当てた領域は Wasm、Newlib に
 管理してもらう
 0xffff800000000000 0xffffc00000000000 ・・ ・ 64KiB ・・ ・ Wasmが使う Newlib が使う
  15. Wasm コンパイラ: wasker
 • RustとLLVMで開発中
 • WasmのLLVMフロントエンドを書いている(Wasm to LLVM IR)


    • LLVM IRの表現力 > Wasmの表現力なので, 割と書きやすい
 ◦ 2k行くらいで動いている

  16. CI
 • GitHub Actions 上で QEMU を動作して E2E テストを実行
 •

    mew から期待する出力が得られたら pass
 • reusable workflow にすることで mew、wasker 両方から実行

  17. unikernel の歴史: 2013~2016
 • この頃の unikernel は独自の API を持っていた
 →

    既存のアプリケーションは移植が必要
 新規のアプリケーションもその API で開発
 
 • 例えば
 ◦ MirageOS → OCaml しか動かない
 ◦ IncludeOS → C++ しか動かない
 59
  18. unikernel の歴史: 2016~現在
 • 「じゃあ Linux 向けのバイナリを動かそう!」
 → Linux バイナリ互換

    unikernel の登場
 
 • 様々な実装
 ◦ OSv
 ◦ HermiTux
 ◦ Unikraft
 60
  19. unikernel の歴史: 2016~現在
 • Linux バイナリ互換ということは、
 システムコールを実装しなければならない
 → つらい(再リンク・バイナリ書き換え..)
 


    • Linux との互換性を追求し続けなければならない
 → つらい(unikernel の機能の小ささが犠牲に)
 
 unikernel の軽量さが損なわれてしまった...
 61
  20. unikernelの互換性問題の解決
 62 従来
 互換性/軽量さにトレードオフ
 ⨯ 互換性
 ✓ 軽量
 ✓ 互換性


    ⨯ 軽量
 mew
 WASIによる
 カーネルインターフェース
 ✓ 互換性
 ✓ 実行速度
 🔥 WASI によって unikernel の互換性の問題を解決
  21. まとめ
 • クラウドの仮想化環境を最適化したい
 • Wasmを実行するunikernelを開発する
 • unikernelをコンテナとして動かす
 • → Wasm

    がより高速に動作する
 • → unikernel を扱いやすくする
 • カーネルの API としての WASI を普及させる
 
 72