GKE、Cloud Run、App Engine、Cloud Functions のための gVisor ファイル システムのパフォーマンス改善
Google Cloud Japan Team
※この投稿は米国時間 2023 年 1 月 31 日に、Google Cloud blog に投稿されたものの抄訳です。
柔軟なアプリケーション アーキテクチャ、CI / CD パイプライン、およびコンテナ ワークロードは、信頼できないコードを実行することが多いため、機密性の高いインフラストラクチャから分離する必要があります。一般的に採用されているソリューションの一つとして、多層防御プロダクト(gVisor を使用する GKE Sandbox など)をデプロイして、保護レイヤーの追加によってワークロードを分離する方法が挙げられます。Google Cloud のサーバーレス プロダクト(App Engine、Cloud Run、Cloud Functions)も、gVisor を使用してアプリケーションのワークロードをサンドボックス化しています。
ただし、防御の階層を増やすと、新たなパフォーマンス上の課題が発生することもあります。Google は、gVisor のユーザー空間カーネルでファイル システムのパスを走査するためにいくつかの操作が必要となったときに、そのような課題を 1 つ発見しました。Google は、この課題に対処し、gVisor のパフォーマンスを大幅に向上させるため、同レベルのセキュリティを維持しながら、パフォーマンスを考慮したまったく新しいファイル システム層を記述しました。新しいファイル システム(VFS2)により、ファイル システムのシステムコールに必要な操作回数が減り、ロックの競合が減り、より効率的にメモリが割り当てられ、Linux との互換性が向上します。
多層防御とファイル システム
第 1 の防御層は、ユーザーモードで動作する gVisor カーネルです。gVisor の脅威モデルでは、悪意のあるコンテナが、基盤となるホスト インフラストラクチャや他のワークロードから隔離されたまま、gVisor カーネルを侵害できることが想定されています。gVisor カーネルは信頼できないため、ファイル システムに直接アクセスできません。ファイル システムの操作は、悪意のあるワークロードから隔離されたプロキシ(Gofer といいます)によって仲介されます。open、create、stat などの操作は、プロキシに転送され、審査された後、プロキシによって実行されます。Gofer は、Pod 内のコンテナごとに 1 つあり、別プロセスとして実行されます。必要なアクセスのみを許可するよう多層防御層でも保護されています。Gofer がファイルへのアクセスを許可した後は、読み書き操作を gVisor が直接ホストに行うことで、パフォーマンスを向上できます。
gVisor カーネルのファイル システムの手直し作業前は、ファイルパスを走査するのに多数の操作が必要であり、パフォーマンスが落ちました。この問題は、各操作の往復費用が RPC とスケジューリングにかかる費用で悪化する、Gofer にマウントされたファイル システムを使用する場合に特に顕著に見られました。さらに、gVisor のサンドボックスは、各パス コンポーネントを走査するときに Gofer に対して新しい RPC を発行するため、パフォーマンスが大幅に低下します。
ファイル システムのパフォーマンス向上
この課題に対処するには、パス解決をファイル システムに直接委ねる機能を gVisor の Sentry に持たせる必要がありました。これにより、Gofer ファイル システムは、操作時にパス コンポーネントごとに 1 つの RPC を発行するのではなく、大規模な走査を実行するために 1 つの RPC を発行できるようになりました。例として、VFS1 では、stat(/foo/bar/baz)により、Gofer に対して少なくとも 3 つの RPC(foo、bar、baz)が生成されますが、VFS2 では 1 つしか生成されません。
この機会に、サンドボックス - Gofer のプロトコル層についても手直しを行いました。以前は、9P2000.L プロトコルの修正版を使用していました。しかし、このプロトコルは非常に処理量が多く、多数の RPC を発行し、メモリの消費量が大きいことが判明しました。そこで、9P の代わりに LISAFS(Linux サンドボックス ファイル システム プロトコル)という新しいプロトコルを構築しました。LISAFS は、RPC とメモリ使用量に関してより経済的です。LISAFS は、複数のパス コンポーネント走査のための RPC を提供します。VFS2 の Gofer ファイル システムは、このようなワンショット走査を LISAFS で実行できるようになりました。また、LISAFS は、RPC よりはるかに高速なファイル IO を実行できます。
open、create、stat、list、load libraries など、頻繁にファイル システム操作を行うワークロードは、VFS2 と LISAFS によりパフォーマンスが向上しています。これらのワークロードの例としては、Python や NodeJS などのインタプリタ言語の実行や、多数のインポート、ソースからのバイナリ構築などが挙げられます。bazel などの CI / CD ワークロードは、大規模なコードベースを基盤とし、ファイル システムのパフォーマンスに関する優れた分析情報を提供します。このようなワークロードは、多くのソースファイルを開いて読み取り、多くのオブジェクト ファイルとバイナリを書き込む必要があります。
2022 年 12 月時点の gRPC と Abseil を構築したオープンソースの bazel ベンチマークの結果を紹介します。これらは GKE に似た環境で実行されました。結果を理解するうえで、以下の用語を把握しておくことをおすすめします。
runsc のオーバーヘッド: gVisor がネイティブと比較して追加するパフォーマンス オーバーヘッドです。たとえば、ワークロードのネイティブ実行(runc を使用)に 10 秒かかり、runsc に 13 秒かかる場合、runsc のオーバーヘッドは 30% となります。
root: プロジェクトのソースコードはルート ファイル システムに置かれ、排他モードでマウントされます。つまり、サンドボックスがファイル システムを完全制御し、より積極的なキャッシュ保存によってパフォーマンスを向上させます。
bind: プロジェクトのソースコードは、バインド マウントに置かれます。バインド マウントはすべて共有モードでマウントされます。つまり、外部からのファイル変更が発生する可能性があり、gVisor はアクセスのたびにキャッシュを再検証し、状態を最新に保ちます。
tmpfs: プロジェクトのソースコードは、tmpfs(インメモリ ファイル システム)に置かれます。
VFS2 と LISAFS は、これらすべての構成で一貫してパフォーマンスを向上させ、runsc をネイティブ(runc)のパフォーマンスに近づけていることがわかります。
VFS2 と LISAFS は、GKE とサーバーレスの全プロダクトで 100% リリースされています。Google は、これらの最適化を数か月にわたって段階的に展開しました。これらは、初期化時に多くのファイル システムの作業を行う一部のアプリケーションのコールド スタート時間の改善にも役立ちました。たとえば、2022 年 8 月からの App Engine 用の LISAFS 公開データでは、LISAFS によってコールド スタートが平均 25% 以上改善されたことが示されています。
コンテナ ワークロードの多層防御を本格的に実現することで、gVisor ファイル システムで新しい実装が必要となるなど、パフォーマンスのトレードオフを特定することができました。これらの改善により、セキュリティについて妥協することなく、このパフォーマンス ギャップをかなり埋めることができます。Google は、VFS2 アーキテクチャによって、セキュリティとパフォーマンスのトレードオフの改善を継続しながら、エンタープライズ対応のコンテナ セキュリティ ソリューションを提供し続けることができます。
今すぐ GKE Sandbox を試して、ワークロード セキュリティを強化
GKE Sandbox は、ワークロードにもう 1 階層のセキュリティ レイヤーを提供し、すぐにでも使うことができます。「GKE Sandbox を有効にする」ガイドを読むか、「GKE Sandbox の概要」を確認してコンテナ セキュリティについて学ぶか、Google Cloud の無料トライアルで今すぐ利用してみましょう。技術的な詳細については、gVisor の公式ドキュメントをご参照ください。また、GitHub ではソースの確認や、投稿もできます。Google Cloud 上でサンドボックス化されたワークロードがさらに多く実行されることを期待しています。
Cloud Run を試して、フルマネージド型コンテナ ランタイムを実現
Cloud Run の各コンテナ インスタンスは、厳重なサンドボックスで保護されています。Cloud Run の第 1 世代の実行環境は gVisor を活用しており、このブログ投稿で説明している改善の恩恵を受けています。ぜひ Cloud Run を使ってみましょう。
役に立つリンク
- ソフトウェア エンジニア Ayush Ranjan
- ソフトウェア エンジニア Fabricio Voznika