Wasmtime

Bytecode Alliance が開発する WebAssembly のリファレンスランタイム。WASI および Component Model の世界初の完全実装。Cranelift コンパイラバックエンドによるセキュリティ重視の設計と、Pooling Allocator + CoW によるマイクロ秒レベルのインスタンス化が特徴。Fastly Compute と Fermyon Spin (Akamai) の基盤。

基本情報

項目値
最新バージョンv45.0.0 (2026-05-21)
言語Rust
ライセンスApache 2.0 with LLVM Exception
リリースサイクル月次 (毎月 20日前後)
LTS12バージョンごと、2年間のセキュリティ修正
Tier 1 プラットフォームx86_64 (Linux, macOS, Windows)

主要利用者: Fastly Compute (10,000+ ユーザー)、Fermyon Spin/Akamai (75M req/sec)、Shopify Functions、wasmCloud、NGINX Unit。

コンパイルパイプライン

graph TD
    Wasm["WASM バイナリ"] --> Validate["1. 検証 & モジュール設定<br/>(wasmparser)"]
    Validate --> Compile["2. 並列関数コンパイル"]
    Compile --> Cranelift["Cranelift<br/>最適化コンパイラ<br/>高品質コード"]
    Compile --> Winch["Winch<br/>ベースラインコンパイラ<br/>高速コンパイル"]
    Cranelift --> Artifact["3. アーティファクト集約<br/>(ELF イメージ)"]
    Winch --> Artifact
    Artifact --> Execute["4. 実行準備<br/>JIT コード配置"]

Cranelift (最適化コンパイラ)

~200K 行の Rust (LLVM の 2000万行と対照的)。セキュリティとコンパイル速度を最優先。

特徴詳細
IRCLIF (SSA 形式)。未定義動作を設計上排除
Mid-end 最適化Acyclic E-graph (aegraph): 業界初の e-graph ベース本番コンパイラ。GVN + LICM + DCE を統合
ISA ローワリングISLE DSL で宣言的にリライトルールを記述
レジスタアロケータregalloc2: バックトラッキング型。SSA ネイティブ。シンボリックチェッカーで形式検証
関数インライニングv36+ (off-by-default、baking 中)

ISA サポート:

ISACraneliftWinch
x86_64Tier 1Tier 1
aarch64Tier 2Tier 1 (v35+)
s390xTier 2—
riscv64Tier 2—

Cranelift vs LLVM

観点CraneliftLLVM
コードサイズ~200K 行 Rust~20M+ 行 C++
コンパイル速度20-40% 高速ベースライン
コード品質ネイティブの ~86%ネイティブの ~100%
IR の未定義動作なしundef, poison あり
セキュリティ悪意ある入力への耐性設計汎用コンパイラ
サンドボックスエスケープ CVE2016年以降 2件—

Winch (ベースラインコンパイラ)

シングルパスで WASM オペコードごとに定型の機械語列を出力。Cranelift のコンパイル時間がボトルネックになる cold start シナリオで使用。最適化は最小限だがコンパイル速度は極めて高速。

Pooling Allocator + CoW

Wasmtime のインスタンス化が マイクロ秒レベルで完了する理由。

graph LR
    subgraph "Pooling Allocator"
        Pool["事前確保メモリプール<br/>(起動時に大きなメモリ領域を確保)"]
        Inst["インスタンス割り当て<br/>(malloc 不要、プールから取得)"]
        Free["インスタンス破棄<br/>(madvise 一回でリセット)"]
    end
    Pool --> Inst --> Free --> Pool

AOT コンパイル

wasmtime compile input.wasm    # -> input.cwasm
wasmtime input.cwasm           # コンパイル不要で即実行
let module = Module::new(&engine, wasm_bytes)?;
let serialized = module.serialize()?;
// 後でデシリアライズ (コンパイルスキップ)
let module = unsafe { Module::deserialize(&engine, &serialized)? };

.cwasm は Engine 設定と Wasmtime バージョンに厳密に紐づく。信頼できるソースのもののみ使用すべき。

メモリ安全性: ガードページ

[2GB ガード] [4GB リニアメモリ領域 (初期 64KB)] [2GB ガード]

セキュリティ

機構説明
サンドボックスコールスタック不可視、メモリ境界ポインタ、型検査付き制御フロー
Rust 実装コンパイル時エラー検出。public API 経由でのセグフォルト防止保証
Fuel命令単位の CPU 制限。store.set_fuel(10_000) で燃料設定
Epoch Interruption固定サイクルごとに変数検査。Fuel より高速だが非決定論的
Capability-basedファイル/ディレクトリは明示的に付与された capability のみアクセス可能
Proof-Carrying Codeメモリ操作がサンドボックス内に留まることを検証 (~1% オーバーヘッド)
Spectre 緩和call_indirect のバウンズチェック、br_table の決定論的投機ルーティング

WASI / Component Model

仕様サポート
WASI Preview 1完全対応 (P2 インフラ上に再実装済み)
WASI Preview 2完全対応 (世界初の完全実装)
WASI Preview 3RC サポート (v37+、native async)
Component Modelリファレンス実装

wasmtime serve: wasi:http/proxy world を実装したコンポーネントを HTTP サーバーとして実行。

パフォーマンス

指標値
コード品質V8 TurboFan の ~98%、LLVM の ~86%
コンパイル速度LLVM の 20-40% 高速
インスタンス化マイクロ秒レンジ (Pooling Allocator + CoW)
Cold StartFermyon Spin で sub-0.5ms
ホスト-ゲスト呼び出し最小 10 ナノ秒
最小ビルドサイズ2.1MB (x86_64、組み込み向け)
メモリフットプリント~15MB

API と言語バインディング

言語安定性備考
RustTier 1ネイティブ API。crates.io wasmtime
CTier 1libwasmtime.a。他言語バインディングの基盤
Python—PyPI wasmtime
Go—wasmtime-go
.NET—NuGet Wasmtime

#![no_std] サポート (Tier 2) で組み込み用途にも対応。Pulley インタプリタで Cranelift 未対応プラットフォームでも動作。

他ランタイムとの比較

観点WasmtimeWasmerWasmEdge
WASI P2完全 (初)追随中追随中
Component Modelリファレンス実装追随中追随中
Cold Start3ms2ms1.5ms
メモリ15MB12MB8MB
独自機能Pooling Allocator, MPK, LTSWASIX (POSIX 互換)WASI-NN (TF Lite, llama.cpp)
ガバナンスBytecode Alliance (非営利)Wasmer Inc. (営利)CNCF Sandbox
方針標準準拠最重視プラグマティック拡張重視

選択指針: FaaS/セキュリティ重視なら Wasmtime、レガシー POSIX 移行なら Wasmer、Edge AI/IoT なら WasmEdge。

押さえどころ(カード化候補)

関連

Graph