WebAssemblyが50マイクロ秒以下で起動する「Lucet」。コンパイラとランタイムをFastlyがオープンソースで公開
CDNプロバイダとして知られるFastlyは、WebAssemblyのコンパイラとランタイムで構成される「Lucet」をオープンソースで公開したと発表しました。
WebAssemblyとは、Webブラウザ上でネイティブコードに近い実行速度で高速に実行できるバイナリフォーマットです。
マイクロソフト、Google、Mozilla、AppleなどのWebブラウザベンダがW3CのWebAssembly Community Groupなどを通じて共同で開発に取り組んでおり、すでに主要ブラウザで実行環境が整っています。
Lucetは50マイクロ秒でWebAssemblyモジュールが起動
LucetはこのWebAssemblyをWebブラウザではなく、Fastlyのエッジクラウドで高速かつ安全に実行する目的で開発されたもの。
しかも50マイクロ秒(1マイクロ秒は100万分の1秒)以下でWebAssemblyモジュールが起動し、メモリオーバーヘッドはわずか数キロバイトという、非常に高速で軽量な実行環境だと説明されています。「Announcing Lucet: Fastly’s native WebAssembly compiler and runtime」から引用。
A major design requirement for Lucet was to be able to execute on every single request that Fastly handles. That means creating a WebAssembly instance for each of the tens of thousands of requests per second in a single process, which requires a dramatically lower runtime footprint than possible with a browser JavaScript engine. Lucet can instantiate WebAssembly modules in under 50 microseconds, with just a few kilobytes of memory overhead.
Lucetの主な要件は、Fastlyが扱うすべてのリクエストに対応できることだった。つまりこれは、1つのプロセスにおいて1秒あたり数万ものリクエストに対応するWebAssemblyインスタンスを生成する、ということだ。これを実現するにはWebブラウザのJavaScriptエンジンよりも劇的にランタイムのフットプリントを小さくすることが求められた。LucetはWebAssemblyモジュールをわずか数キロバイトのメモリオーバーヘッドとともに、50マイクロ秒以下で起動できる。
By comparison, Chromium’s V8 engine takes about 5 milliseconds, and tens of megabytes of memory overhead, to instantiate JavaScript or WebAssembly programs.
比較対象となるChromium V8エンジンでは、JavaScriptもしくはWebAssemblyのプログラムの起動に起動に5ミリ秒、そして数十メガバイドとのメモリオーバーヘッドが発生する。
LucetはWebAssemblyモジュールをネイティブコードへコンパイルするコンパイラと、コンパイル済みネイティブコードのリソース管理およびフォルト時のトラップなどを行うランタイムに分かれています。コンパイラはWebブラウザで一般に用いられているJITコンパイラ(Just-in-Timeコンパイラ=実行時コンパイラ)ではなく、AOTコンパイラ(Ahead-of-Timeコンパイラ=事前コンパイラ)であり、これにより大幅なシンプル化とネイティブコード実行時のオーバーヘッドを実現できたとしています。
このLucetを用いたFastyのエッジクラウドは、同一プロセス内で数万ものWebAssemblyプログラムを同時に実行可能で、しかもそれぞれのWebAssemblyプログラムは自身のリソースにのみアクセスできることが保証されているため、従来と同様のセキュリティを実現できるとされています。
これにより、Fastlyの顧客はWebAssemblyに対応した汎用言語で、セキュリティを気にすることなくエッジで実行可能なロジックなどを記述できるようになるとのこと。
Fastlyは現在、Faslty Labsにおいて同社のエッジクラウドでWebAssemblyプログラムを実行する「Terrarium」を試験的に提供しています(Terrariumの画面を見ると、MozillaのWebAssembly Studioに似ていますね)。
TerrariumはC、TypeScript、Rust言語のいずれかで記述したプログラムをコンパイルしてWebAssemblyモジュールへ変換し、それをFasltyのエッジクラウドで実行できるWeb開発環境と実行環境を提供するもの。
Lucetはそのエンジンとして使われていると説明されています。
FastlyはMozillaと協力して開発
FastlyはLucetの開発に関してMozillaと密接に協力しているようです。
Lucetのコンパイラは、Mozillaが開発している「Cranelift Code Generator」を用いています。
Cranelift Code Generatorは、中間表現からネイティブバイナリへ変換する汎用変換エンジンとして開発中ですが、LucetではこれをWebAssemblyバイナリからネイティブコードへ変換するコンパイラに用いているわけです。
さらにLucetはMozillaが標準化作業の開始を発表した「WASI」(動画では「ワズィ」と発音しているように聞こえます)への対応も表明しています。
もともとWebAssemblyはWebブラウザ上で高速にアプリケーションを実行するためのバイナリ仕様として策定されたため、LucetのようにWebブラウザ以外の環境で実行することは想定していませんでした。
WASIは、OS上で実行されるアプリケーションがファイルシステムやネットワーク、メモリリソースなどへのアクセスをAPI経由で行えるのと同じように、WebAssemblyでもこれらにアクセスする標準的なインターフェイスを策定しよう、というものです。
これによってWebAssemblyアプリケーションが、通常のサーバアプリケーションやデスクトップアプリケーションと同じように、WebAssemblyが持つポータビリティを保ちつつさまざまな機能を実装できるようになることを目指しています。
これについては、次の記事「WebAssemblyをWebブラウザ以外の実行環境へ。システムインターフェイスへのアクセスを可能にする「WASI」の策定開始。Mozillaが呼びかけNode.jsらが賛同」で詳しく紹介していますので、ご覧ください。
CloudflareもエッジでWebAssembly対応
Fastlyと同じCDNプロバイダのCloudflareは、エッジでJavaScriptとServiceWorkerを実行できるサービス「Cloudflare Workers」をすでに提供しています。エッジにおけるアプリケーション実行環境はWebブラウザと整合性のあるものになっていく流れができつつあるようです。
あわせて読みたい
WebAssemblyをWebブラウザ以外の実行環境へ。システムインターフェイスへのアクセスを可能にする「WASI」の策定開始。Mozillaが呼びかけNode.jsらが賛同
≪前の記事
2018年の国内パブリッククラウドサービス市場規模は前年比27.2%増の6688億円。2023年には2.5倍の1兆7000億円に。IDC Japan