WebAssemblyが50マイクロ秒以下で起動する「Lucet」。コンパイラとランタイムをFastlyがオープンソースで公開

2019年4月1日

CDNプロバイダとして知られるFastlyは、WebAssemblyのコンパイラとランタイムで構成される「Lucet」をオープンソースで公開したと発表しました

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技術 Fastly




タグクラウド

クラウド
AWS / Azure / Google Cloud
クラウドネイティブ / サーバレス
クラウドのシェア / クラウドの障害

コンテナ型仮想化

プログラミング言語
JavaScript / Java / .NET
WebAssembly / Web標準
開発ツール / テスト・品質

アジャイル開発 / スクラム / DevOps

データベース / 機械学習・AI
RDB / NoSQL

ネットワーク / セキュリティ
HTTP / QUIC

OS / Windows / Linux / 仮想化
サーバ / ストレージ / ハードウェア

ITエンジニアの給与・年収 / 働き方

殿堂入り / おもしろ / 編集後記

全てのタグを見る

Blogger in Chief

photo of jniino

Junichi Niino(jniino)
IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。
詳しいプロフィール

Publickeyの新着情報をチェックしませんか?
Twitterで : @Publickey
Facebookで : Publickeyのページ
RSSリーダーで : Feed

最新記事10本