Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CNDS2024
Search
ainozaki
June 14, 2024
2
1.1k
CNDS2024
ainozaki
June 14, 2024
Tweet
Share
More Decks by ainozaki
See All by ainozaki
WebAssembly Night_Wasmを実行するunikernelとWasmコンパイラ
ainozaki
7
2k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
45
4.8k
Code Reviewing Like a Champion
maltzj
518
39k
What's new in Ruby 2.0
geeforr
340
31k
Designing Experiences People Love
moore
138
23k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
22
580
A Modern Web Designer's Workflow
chriscoyier
690
190k
GitHub's CSS Performance
jonrohan
1029
450k
The Brand Is Dead. Long Live the Brand.
mthomps
53
37k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
24
2k
KATA
mclloyd
27
13k
A Tale of Four Properties
chriscoyier
155
22k
Ruby is Unlike a Banana
tanoku
96
10k
Transcript
次世代のクラウドネイティブ基盤 Wasmの今と未来 CloudNative Days Summer 2024 @札幌 2024/06/15 Soichiro
Ueda, Ai Nozaki 1
2 上田 蒼一朗 京都大学 岡部研究室 M1 ❤ インフラ技術、システムソフトウェア 野崎 愛 東京大学 中村・高瀬研究室 M2 ❤
ハードウェアとソフトウェアの境界 saza-ku saza_ku ainozaki ainno321
3
目次 4 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来
WebAssemblyとは • ブラウザ上で実行可能な仮想命令セットアーキテクチャ ◦ JavaScriptと違ってバイナリの状態で実行 • Wasmランタイムを用いてサーバー上でも実行可能 • 間違われがちなこと ◦
正式な略記はWASMではなく Wasm ◦ アセンブリではない 5
Wasm × クラウドネイティブ? 「コンテナの次はWasmだ!」 「DockerやKubernetesがWasmをサポート!」 「WasmがあったらDockerは作らなかった!」 6
VS ✅ ポータビリティ ✅ セキュリティ ✅ 軽量 7
Wasmの仕組み 8 Wasmランタイム
Wasmランタイムのお仕事 • Wasmバイナリを解釈し、実行する ◦ インタプリタ型・JIT型・AoTコンパイル型 • Wasmとシステムの仲介役 ◦ サンドボックスの提供
◦ システムに対するAPI(WASI)の提供 9
Wasmのバイナリを眺めてみよう 10
これがWasmだ! 11 ↑ WebAssemblyのテキスト形式(WAT)
12 Wasmの実行単位、モジュール この中に一連の実行対象となる命令が記述されている 実行可能ファイルみたいなイメージ
13 実行対象となる命令列 命令列は関数の単位で記述される
14 Wasmはスタックマシン → スタック上で計算を行う 各命令がスタックに対する操作になっている スタック
15 local.get $a ← 引数 $a をスタックに詰む スタック $a
16 local.get $b ← 引数 $b をスタックに詰む スタック $a $b
17 i64.add ← スタックから2つ取り出し、その和を積む スタック $a + $b
18 return ← 一番上に積んでいる値を返す スタック $a + $b ↓ 戻り値
Wasmはスタックマシンだが... • ランダムアクセス可能なメモリも持っている ◦ Linear Memory • Wasmランタイムによって用意され 要求すれば動的にサイズを変更できる ◦
ページ単位で変更でき、1ページ = 64KiB 19 0 64KiB
20 初期のページサイズを指定 i32.store ↑ スタックに積まれた値を Linear Memoryにストアする i32.load ↑ Linear
Memoryの値を スタックに積む memory.grow ↑ Linear Memoryのサイズを変更
IOとかはどうするの? • Wasm自体にIO等を扱う仕組みはない • WebAssembly System Interface (WASI) ◦ システムのリソースを提供するAPIの仕様
◦ ファイル・ネットワークなど • 最新のバージョンは Preview2 ◦ 2024年1月に正式リリース ◦ WASI Preview2、WASI p2、WASI 0.2 などとも 21
22 使いたいWASI関数をimportする WASI Preview1のproc_exitとfd_writeを import
23 importした関数を呼び出す → ランタイム側に処理が委譲される
24 スタック Linear Memory Wasmランタイム Read/Write
目次 25 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来
開発者体験 26 1どう書く? 2どう手元で動かす? 3どこでデプロイ? 4どう共有する?
どう書く? 27 プログラミング言語のWasm対応 WASI p2
どう手元で動かす? 28 手元で動くWasmランタイム Wasmtime, WAMR
どう手元で動かす? 29 コンテナエコシステムとWasmの統合 shim shim shim
どこでデプロイする? 30 Wasmをサポートするサービス
どう共有する? • まだ成熟してない.. • レジストリの仕様:warg ◦ JAF Labsによる wa.dev (public
beta) 31 https://wa.dev/ainozaki:cnds-demo
目次 32 1. Wasmの今 〜基礎編〜 2. Wasmの今 〜開発者体験編〜 3. Wasmの未来
33 Wasmで今一番アツい話題 Component Model
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!
Component Modelの登場 モジュールを超えて型を表現するための仕様 インターフェースの記述言語 WIT • Wasm Interface Type •
import/exportのシグネチャを定義する言語 ◦ WITを元に各言語向けのbindingコードが自動生成される(c.f gRPCのproto) ◦ ユーザが記述し,ユーザが呼び出す バイナリレベルの表現規約 Canonical ABI • Application Binary Interface • 型のバイナリ表現を定義 ◦ 基本ユーザからは見えない 35
Component Modelの登場 36 Component Module from 言語B WITに基づいた 呼び出し Canonical
ABIによる データ表現の一貫性 Canonical ABI Module from 言語A 言語を超えたWasmのリンクを実現できる
例 37 Component Module from 呼び出し
38 Step1: Rustによるcnds_demo componentの作成 WIT/その実装の例が 初期生成される (次スライド)
39 WITによる interfaceの定義 interfaceの中身の実装 初期生成されたファ イルの中身
40 componentのビルド wargにもpublish https://wa.dev/ainozaki:cnds-demo
41 Step2: JSからのcnds_demoの利用 .wasmから 自動生成 jcoにcomponentを渡す
42 自動生成された .jsからimport Run!
さいごに 43 43 まだ議論しなければならないこともあるが魅力 的な技術 バイナリサイズの 大きさ 既存の資産からの 乗り換え 未熟な共有手段
定量的な事例評価
44 Thank you for your attention!
45 お気づきでしょうか...?
46
以下入らなかったスライド 47
48 ← コンパイラにWasmバッ クエンドを追加 ← ビルド RustでWasmを作成する
49 Wasmランタイムで動かす
50 RuntimeClass 作成 Pod作成 Kubernetesから動かす containerd 設定
51 Mewzプロジェクトの簡単な紹介 問題:Wasmの隔離性は Multi-tenancyでは不十分 解決:Wasmに特化した軽量OS低 overheadにVMで隔離 Wasm Runtime Machine Host
OS App App App 軽量OS Host OS + Hypervisor Machine App 軽量OS