サーバーレス関数は初回リクエストの前にランタイムやアプリを準備する時間がかかることがあります。V8 IsolateはV8内でJavaScriptの実行環境を分ける単位です。起動スナップショットは、準備済みのV8ヒープ状態を新しいコンテキストに復元し、一部の初期化を繰り返さずに済む方法です。両者は関係しますが、同じ段階を最適化するものではありません。

V8 Isolateの実行環境と準備済みヒープを起動スナップショットから復元する概念図

Isolateはプロセス境界と同じではない

IsolateはV8内部の論理的な実行環境です。Cloudflareの事業者自身による構成説明では、一つのプロセス内で多数のIsolateを実行し、互いのメモリーにアクセスできないよう設計すると述べています。同記事の起動時間やメモリーの比較値は、執筆当時の特定事業者のシステムに関する説明です。すべてのランタイムに通用する起動時間やセキュリティ保証ではありません。

コンテナはOSレベルの実行環境、V8 IsolateはJavaScriptエンジン内部の境界です。コンテナを使わない方式でも隔離と安全性の確認は必要です。利用できる言語、ネイティブバイナリー、実行モデルも変わることがあるため、既存の処理を移せるかは別に検討します。

起動スナップショットは準備済みヒープを再利用する

V8の記事は、組み込み機能を毎回ゼロから初期化する代わりに、事前に用意したスナップショットをヒープへ逆シリアル化して新しいコンテキストを作る方法を説明しています。V8 4.3頃に紹介されたカスタムスナップショットAPIでは、埋め込み側がコンテキストを作成してスクリプトを実行し、その状態を新しいIsolateのコンテキストで使えるようにします。記事の例は共通スクリプトの準備を繰り返さない構成です。

2015年の記事にあるデスクトップ40msから2ms未満、平均的な携帯電話270msから10msという数値は、当時の環境で示された例です。現在のアプリの計測値やサーバーレス製品の保証ではありません。効果はスナップショットの生成・保存・読み込み、ランタイム版、コード、ハードウェアに左右されます。比較では同じ起動段階を同じ条件で測る必要があります。

スナップショットはV8の外部状態を保存しない

カスタム起動スナップショットが含むのはV8のヒープであり、V8外のあらゆる資源を保存する汎用チェックポイントではありません。V8の記事はAPIコールバックの定義・呼び出しや、外部領域を使うtyped arrayの作成を制約として挙げています。また、Date.now()やMath.random()に由来する値は記録時に固定され、新しいコンテキストで復元しても現在時刻や新しい乱数にはなりません。

現在時刻、乱数、リクエストごとの利用者情報、開いたファイルやソケットなど、実行ごとに変わる値は再利用する起動状態に入れず、実行時に取得します。スナップショットに含める初期化が安全に再利用できるかを試験してください。V8の記事は当時のAPIを扱うため、実際に配備するランタイム版の公式文書とテストで使い方を確認します。

専門的視点:二つの最適化を別々に測る

Cloudflareの記事はIsolateを素早く開始することを目指す構成を説明し、V8の記事はコンテキスト初期化を減らす具体的な仕組みを説明します。前者は実行環境を作る費用、後者はエンジンのコンテキスト準備に関する内容です。異なる時点・段階の数値を足し合わせたり、一つの現行製品の性能として示したりする根拠はありません。

評価では初回実行のランタイム準備、アプリのモジュール初期化、リクエスト処理を別々に記録します。短縮時間だけでなく、スナップショットの生成・配備費用、ランタイム更新時の再生成、メモリー使用量も比較してください。本稿は特定サービスの推奨や遅延改善の保証ではありません。使う予定の版と負荷で実測することが必要です。

出典