(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024096743
(43)【公開日】2024-07-17
(54)【発明の名称】ソフトウェアコンテナの性能および分離を改善するための方法およびシステム
(51)【国際特許分類】
G06F 21/55 20130101AFI20240709BHJP
G06F 9/455 20180101ALI20240709BHJP
G06F 8/52 20180101ALI20240709BHJP
【FI】
G06F21/55
G06F9/455 150
G06F8/52
【審査請求】有
【請求項の数】18
【出願形態】OL
(21)【出願番号】P 2024058964
(22)【出願日】2024-04-01
(62)【分割の表示】P 2020555910の分割
【原出願日】2019-04-11
(31)【優先権主張番号】62/656,051
(32)【優先日】2018-04-11
(33)【優先権主張国・地域又は機関】US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.WINDOWS
2.MySQL
3.XEN
4.DOCKER
5.UBUNTU
6.APACHE
7.MONGODB
(71)【出願人】
【識別番号】516123491
【氏名又は名称】コーネル ユニヴァーシティ
(74)【代理人】
【識別番号】100094112
【弁理士】
【氏名又は名称】岡部 讓
(74)【代理人】
【識別番号】100106183
【弁理士】
【氏名又は名称】吉澤 弘司
(74)【代理人】
【識別番号】100114915
【弁理士】
【氏名又は名称】三村 治彦
(74)【代理人】
【識別番号】100125139
【弁理士】
【氏名又は名称】岡部 洋
(74)【代理人】
【識別番号】100209808
【弁理士】
【氏名又は名称】三宅 高志
(72)【発明者】
【氏名】シェーン,ツィミン
(72)【発明者】
【氏名】フォン レニース,ロバート
(72)【発明者】
【氏名】ウェザースプーン,ハキム
(57)【要約】
【課題】複数のプロセスに対するバイナリ互換性およびサポートを有するソフトウェアコンテナを提供する。
【解決手段】
カーネルベースの分離層を実装し、カーネルベースの分離層上のソフトウェアコンテナをライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含むように構成し、ソフトウェアコンテナのユーザプロセスを実行し、複数の処理デバイスを含む、クラウドベースの処理プラットフォーム、エンタープライズ処理プラットフォームまたは他のタイプの処理プラットフォームによって実行される。ライブラリオペレーティングシステムは、ソフトウェアコンテナ上の複数のユーザプロセスの特権レベルと同レベルでソフトウェアコンテナにおいて動作し、システムコールを対応する関数コールに変換することと連動してユーザプロセスのバイナリの自動翻訳をサポートする。
【選択図】
図3
【特許請求の範囲】
【請求項1】
カーネルベースの分離層を実装することと、
前記カーネルベースの分離層上のソフトウェアコンテナを、専用のオペレーティングシステムカーネルであるライブラリオペレーティングシステムを含めるように構成することと、
前記ソフトウェアコンテナにおいて1つ以上のユーザプロセスを実行することと、を含み、
メモリに結合されたプロセッサをそれぞれ含んでいる複数の処理デバイスを含む処理プラットフォームによって実行され、
前記ライブラリオペレーティングシステムが、前記ソフトウェアコンテナにおいて実行している前記1つ以上のユーザプロセスの特権レベルと同じ特権レベルで前記ソフトウェアコンテナにおいて動作し、
前記ライブラリオペレーティングシステムが、複数のシステムコールを対応する関数コールに即座に変換することにより、前記1つ以上のユーザプロセスのバイナリの自動翻訳をサポートするように構成される、方法。
【請求項2】
前記カーネルベースの分離層が、仮想マシンハイパーバイザ、または前記ソフトウェアコンテナの前記専用のオペレーティングシステムカーネルに関するオペレーティングシステムの少なくとも一部の形で実装されている、請求項1に記載の方法。
【請求項3】
前記カーネルベースの分離層が、仮想マシンハイパーバイザおよびホストオペレーティングシステムのうち1つを含む、請求項1に記載の方法。
【請求項4】
前記ライブラリオペレーティングシステムが、指定されたタイプのモノリシックオペレーティングシステムカーネルから変換される、請求項1に記載の方法。
【請求項5】
前記カーネルベースの分離層上のソフトウェアコンテナがライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含むように構成することがさらに、
既存のソフトウェアコンテナのコンテナイメージを抽出することと、
前記カーネルベースの分離層上の前記ソフトウェアコンテナを構成する際の仮想マシンイメージとして前記抽出されたコンテナイメージを利用することと、を含み、
前記カーネルベースの分離層上の前記ソフトウェアコンテナが前記既存のソフトウェアコンテナのラッピングされたバージョンを含む、請求項1に記載の方法。
【請求項6】
前記既存のソフトウェアコンテナの1つ以上のユーザプロセスが、それらの1つ以上のユーザプロセスのいかなる修正も必要とすることなく前記カーネルベースの分離層上の前記ソフトウェアコンテナの前記1つ以上のユーザプロセスとして実行するのを許可される、請求項5に記載の方法。
【請求項7】
前記カーネルベースの分離層上のソフトウェアコンテナがライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含むように構成することは、前記カーネルベースの分離層上の複数のソフトウェアコンテナを、前記複数のソフトウェアコンテナのそれぞれがライブラリオペレーティングシステムとして別々の専用のオペレーティングシステムカーネルを含むように構成することをさらに含む、請求項1に記載の方法。
【請求項8】
前記ソフトウェアコンテナにおいて1つ以上のユーザプロセスを実行することは、前記複数のソフトウェアコンテナのそれぞれのものの1つ以上のユーザプロセスの別個のセットを実行することをさらに含み、前記別個のセットのうち少なくとも1つが複数の異なるユーザプロセスを含む、請求項7に記載の方法。
【請求項9】
前記複数のソフトウェアコンテナの第1のものにおいて実行している1つ以上のユーザプロセスの前記別個のセットの第1のものは、前記複数のソフトウェアコンテナの第2のものにおいて実行している1つ以上のユーザプロセスの前記別個のセットの第2のものから分離される、請求項8に記載の方法。
【請求項10】
前記ソフトウェアコンテナを構成することは、前記ライブラリオペレーティングシステムおよび前記1つ以上のユーザプロセスがユーザモードで動作する準仮想化されたソフトウェアコンテナとして前記ソフトウェアコンテナを構成することを含む、請求項1に記載の方法。
【請求項11】
前記準仮想化されたソフトウェアコンテナが動作する前記カーネルベースの分離層を実装することは、他の場合は標準仮想マシンハイパーバイザまたはオペレーティングシステムカーネルであるものの修正されたバージョンとして前記カーネルベースの分離層を実装することを含む、請求項10に記載の方法。
【請求項12】
前記ソフトウェアコンテナを構成することは、前記ライブラリオペレーティングシステムおよび前記1つ以上のユーザプロセスがハードウェアアシスト型仮想マシンの中でカーネルモードで動作するハードウェアアシスト型の仮想化されたソフトウェアコンテナとして前記ソフトウェアコンテナを構成することを含む、請求項1に記載の方法。
【請求項13】
前記ハードウェアアシスト型の仮想化されたソフトウェアコンテナが動作する前記カーネルベースの分離層を実装することは、標準仮想マシンハイパーバイザまたはオペレーティングシステムカーネルとして前記カーネルベースの分離層を実装することを含む、請求項12に記載の方法。
【請求項14】
前記カーネルベースの分離層および前記ソフトウェアコンテナの前記ライブラリオペレーティングシステムが、異なるタイプのそれぞれの第1および第2のオペレーティングシステムを用いて実装されている、請求項1に記載の方法。
【請求項15】
メモリに結合されたプロセッサをそれぞれ含んでいる複数の処理デバイスを含む処理プラットフォームを含むシステムであって、
前記処理プラットフォームは、
カーネルベースの分離層を実装し、
前記カーネルベースの分離層上のソフトウェアコンテナを、専用のオペレーティングシステムカーネルであるライブラリオペレーティングシステムを含めるように構成し、
前記ソフトウェアコンテナにおいて1つ以上のユーザプロセスを実行するように構成され、
前記ライブラリオペレーティングシステムが、前記ソフトウェアコンテナにおいて実行している前記1つ以上のユーザプロセスの特権レベルと同じである特権レベルで前記ソフトウェアコンテナにおいて動作し、
前記ライブラリオペレーティングシステムが、複数のシステムコールを対応する関数コールに即座に変換することにより、前記1つ以上のユーザプロセスのバイナリの自動翻訳をサポートするように構成される、システム。
【請求項16】
前記処理プラットフォームが、それぞれの異なるテナントに対して前記カーネルベースの分離層上の1つ以上のソフトウェアコンテナの異なるセットを提供するように構成されており、それぞれのこのようなソフトウェアコンテナはライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含む、請求項15に記載のシステム。
【請求項17】
前記処理プラットフォームが、
クラウドベースの処理プラットフォーム、
エンタープライズ処理プラットフォーム、
モノのインターネット(IoT)プラットフォーム、および
ネットワーク機能仮想化(NFV)プラットフォーム、のうち少なくとも1つを含む、請求項15に記載のシステム。
【請求項18】
1つ以上のソフトウェアプログラムのプログラムコードを中に格納している非一時的プロセッサ可読ストレージ媒体を含むコンピュータプログラム製品であって、前記プログラムコードは、それぞれの処理デバイスがメモリに結合されたプロセッサを含んでいる複数の処理デバイスを含む処理プラットフォームによって実行されると、前記処理プラットフォームに、
カーネルベースの分離層を実装することと、
前記カーネルベースの分離層上のソフトウェアコンテナを、専用のオペレーティングシステムカーネルであるライブラリオペレーティングシステムを含めるように構成することと、 前記ソフトウェアコンテナにおいて1つ以上のユーザプロセスを実行することと、
前記ライブラリオペレーティングシステムが、前記ソフトウェアコンテナにおいて実行している前記1つ以上のユーザプロセスの特権レベルと同じである特権レベルで前記ソフトウェアコンテナにおいて動作することと、
前記ライブラリオペレーティングシステムが、複数のシステムコールを対応する関数コールに即座に変換することにより、前記1つ以上のユーザプロセスのバイナリの自動翻訳をサポートすることとを行わせる、コンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【0001】
優先権の主張
本出願は2018年4月11日に出願の「Method and System for Improving Software Container Performance and Isolation」と題する米国仮特許出願第62/656,051号の優先権を主張し、これは参照により完全に本明細書に組み込まれる。
【0002】
政府支援の陳述
本発明は、米国科学財団(NSF)によって授与された契約番号CSR-1422544、CNS-1601879、CSR-1704742、1053757および0424422、米国国立標準技術研究所(NIST)によって授与された契約番号60NANB15D327および70NANB17H181、ならびに、米国国防総省高等研究計画局(DARPA)によって授与された契約番号FA8750-10-2-0238、FA8750-11-2-0256およびD11AP00266の下で政府支援を受けてなされた。米国政府は、本発明における一定の権利を有する。
【0003】
本発明の分野は、概して情報処理システムに関し、より具体的には、このようなシステムで利用されるソフトウェアコンテナに関する。
【背景技術】
【0004】
コンテナは、アプリケーションをパッケージングする好適な方法となっており、サーバレスアーキテクチャおよび多数の他のタイプの処理プラットフォームのキーコンポーネントである。また同時に、エクソカーネル(exokernel)アーキテクチャは、ハイパーバイザがエクソカーネルとして役割を果たし、多くのライブラリオペレーティングシステム(OS)が提供されているかまたは開発中であることによって、牽引力を得ている。エクソカーネルは、それらのトラステッドコンピューティングベース(Trusted Computing Base、TCB)および攻撃対象領域が小さいため、優れたセキュリティ分離特性を有し、一方でライブラリOSは特定のアプリケーションのためにカスタマイズすることができる。残念なことに、これらの2つの傾向は、現在互いに互換性がない。現在のライブラリOSは、最新のアプリケーションコンテナを動作させるために必要となっている、複数のプロセスに対するバイナリ互換性およびサポートを欠いている。
【発明の概要】
【0005】
例示の実施形態は、本明細書においてXコンテナと称される、改良型のソフトウェアコンテナを提供する。1つ以上の実施形態のXコンテナアーキテクチャにおいて、Xコンテナは、例示として、仮想マシンハイパーバイザおよびホストオペレーティングシステムのうち1つを用いて実装されるXカーネル上のライブラリOSとして、専用のLinux(登録商標)カーネルによって動作する。Xカーネルは、さらに一般的に言えば、本明細書において、「カーネルベースの分離層」と呼ばれるものの例である。結果として得られるXコンテナの配置は、例示として、変更されていないマルチプロセッシングアプリケーションをサポートして、即座に自動的にアプリケーションバイナリ置換を最適化する。このタイプのいくつかの実施形態のXコンテナは、変更されていないLinux(登録商標)と比較してシステムコールオーバーヘッドのかなりの減少を好都合に提供すると共に、ウェブベンチマーク上のUnikernelおよびGrapheneのようなライブラリOSも著しく上回る。
【0006】
一実施形態において、方法は、カーネルベースの分離層を実装して、カーネルベースの分離層上のソフトウェアコンテナをライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含むように構成して、ソフトウェアコンテナの1つ以上のユーザプロセスを実行することを含む。この方法は、複数の処理デバイスを含む、クラウドベースの処理プラットフォーム、エンタープライズ処理プラットフォームまたは他のタイプの処理プラットフォームによって実行され、それぞれのこのような処理デバイスがメモリに結合されたプロセッサを含む。
【0007】
ライブラリオペレーティングシステムは、例示として、ソフトウェアコンテナにおいて実行している1つ以上のユーザプロセスの特権レベルと同じである特権レベルで、ソフトウェアコンテナで動作する。
【0008】
ライブラリオペレーティングシステムは、いくつかの実施形態では例示として、システムコールを対応する関数コールに変換することと連動して1つ以上のユーザプロセスのバイナリの自動翻訳をサポートするように構成される。
【0009】
本発明のこれらの、そしてまた他の、例示の実施形態は、その中で実施されるソフトウェアプログラムコードを有するプロセッサ可読ストレージ媒体を含む、システム、方法、装置、処理デバイス、集積回路およびコンピュータプログラム製品を含むが、これに限定されるものではない。
【図面の簡単な説明】
【0010】
【
図1】
図1は、例示の実施形態のクラウドベースの処理プラットフォームを実装しているXコンテナを含む、情報処理システムを示す。
【
図2】
図2は、例示の実施形態のXコンテナを実装しているエンタープライズ処理プラットフォームを含む、情報処理システムを示す。
【
図3】
図3は、例示の実施形態のXコンテナの例示の配置を示す。
【
図4】
図4は、本明細書において開示されるXコンテナを利用しているアーキテクチャを含む様々なアーキテクチャの分離境界を例示する。
【
図5】
図5は、例示の実施形態の、異なる数のXコンテナを使用している2つのアプリケーションの代替構成を示す。
【
図6】
図6は、例示の実施形態の、1つ以上のXコンテナで実行されるバイナリ置換の例を示す。
【
図7】
図7は、例示の実施形態の評価において利用されるソフトウェアスタックの例を示す。
【
図8】
図8は、例示の実施形態で実行される評価の結果を示しているプロットである。
【
図9】
図9は、例示の実施形態で実行される評価の結果を示しているプロットである。
【
図10】
図10は、例示の実施形態で実行される評価の結果を示しているプロットである。
【
図11】
図11は、例示の実施形態で実行される評価の結果を示しているプロットである。
【
図12】
図12は、例示の実施形態で実行される評価の結果を示しているプロットである。
【発明を実施するための形態】
【0011】
本発明の実施形態は、例えば、コンピュータネットワークを含む情報処理システム、または、ネットワーク、クライアント、サーバ、処理デバイスおよび他のコンポーネントの他の配置の形で実施することができる。このようなシステムの例示の実施形態を、本明細書において詳述する。しかしながら、本発明の実施形態は、多種多様な他のタイプの情報処理システムおよび関連するネットワーク、クライアント、サーバ、処理デバイスまたは他のコンポーネントに、さらに一般的に適用できることを理解すべきである。
したがって、「情報処理システム」という本明細書で用いられる用語は、概して、これらおよび他の配置を含むと解釈されることを意図している。
【0012】
図1は、例示の実施形態のXコンテナを実装している情報処理システム100を示す。システム100は、複数のユーザデバイス102-1、102-2、...102-Nを含む。ユーザデバイス102は、ネットワーク105上でクラウドベースの処理プラットフォーム104と通信するように構成される。
【0013】
ユーザデバイス102の1つ以上は、それぞれ、例えば、ラップトップコンピュータ、タブレット型コンピュータもしくはデスクトップパーソナルコンピュータ、携帯電話、または別のタイプのコンピュータもしくは通信デバイス、および複数のこのようなデバイスの組合せを含むことができる。いくつかの実施形態では、ユーザデバイス102の1つ以上はそれぞれのコンピューティングノードを含むことができ、それは例示として、1つ以上の処理プラットフォームに実装されて、おそらくクラウドベースの処理プラットフォーム104を含む。
【0014】
システム100の様々な要素の間の通信は、図のネットワーク105によって集合的に表される1つ以上のネットワークを通じて行われると仮定する。ネットワーク105は、例示として、例えば、インターネットなどのグローバルコンピュータネットワーク、広域ネットワーク(WAN)、ローカルエリアネットワーク(LAN)、衛星ネットワーク、電話もしくはケーブルネットワーク、携帯電話ネットワーク、WiFiまたはWiMAXなどの無線プロトコルを使用して実装されるワイヤレスネットワーク、またはこれらおよび他のタイプの通信ネットワークの様々な部分もしくは組合せを含むことができる。
【0015】
クラウドベースの処理プラットフォーム104は、より一般的に本明細書において、メモリに結合されたプロセッサをそれぞれ含んでいる複数の処理デバイスを含む、「処理プラットフォーム」と称されるものの例である。処理デバイスの1つ以上は、複数のプロセッサおよび/または複数のメモリをそれぞれ含むことができる。
【0016】
処理プラットフォームの所与のこのような処理デバイスのプロセッサは、例えば、マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、中央演算処理装置(CPU)、演算論理ユニット(ALU)、グラフィック処理装置(GPU)、デジタルシグナルプロセッサ(DSP)または他の類似の処理デバイスコンポーネント、ならびに任意の組合せの他のタイプおよび配置の処理回路を含むことができる。
【0017】
処理プラットフォームの所与のこのような処理デバイスのメモリは、例えば、スタティックランダムアクセスメモリ(SRAM)、ダイナミックランダムアクセスメモリ(DRAM)もしくは他のタイプのRAM、読取り専用メモリ(ROM)、フラッシュメモリもしくは他のタイプの不揮発性メモリ、磁気メモリ、光メモリ、または任意組合せの他のタイプのストレージなどの、電子メモリを含むことができる。
【0018】
メモリは、例示として、プロセスによる実行のためのプログラムコードを記憶する。このようなメモリは、より一般的に本明細書において、その中で実施されるプログラムコードを有する、「プロセッサ可読ストレージ媒体」と称されるものの例である。
【0019】
このようなプロセッサ可読ストレージ媒体を含む製品は、本発明の実施形態と考えられる。本明細書で用いられる「製品」という用語は、一時的な、伝播している信号を除くものと理解すべきである。
【0020】
プロセッサ可読ストレージ媒体を含む他のタイプのコンピュータプログラム製品は、他の実施形態で実施することができる。
【0021】
加えて、本発明の実施形態は、本明細書において開示されるように、Xコンテナを実装することに関連した処理動作を実施するように構成された処理回路を含んだ、集積回路の形で実装することができる。
【0022】
クラウドベースの処理プラットフォーム104または本明細書において開示される他の処理プラットフォームの所与の処理デバイスは、通常上記のプロセッサおよびメモリに加えて他のコンポーネントを含む。例えば、所与の処理デバイスは、例示として、処理デバイスが他のシステム要素とネットワーク105を通じて通信することができるように構成されたネットワークインタフェースを含む。このようなネットワークインタフェースは、例示として、1つ以上の従来のトランシーバを含む。
【0023】
本実施形態のクラウドベースの処理プラットフォーム104は、より具体的には、物理インフラストラクチャ114で動作している仮想化インフラストラクチャ112を利用している複数のXコンテナ110を実装する。物理インフラストラクチャ114は例示として、上記のタイプの複数の処理デバイスを含み、それぞれが少なくとも1つのプロセッサおよび少なくとも1つのメモリを含む。例えば、いくつかの実施形態では、物理インフラストラクチャは、ベアメタルホストまたは他のタイプのコンピュータまたはサーバを含む。仮想化インフラストラクチャ112はいくつかの実施形態では仮想マシンハイパーバイザを含むが、ハイパーバイザはXコンテナ110を実装するために必要ではない。したがって、仮想化インフラストラクチャ112は、他の実施形態では除去することができる。
【0024】
図2の情報処理システム200は、仮想化インフラストラクチャ112などの仮想化インフラストラクチャを含まない、1つの可能性がある別の実施形態を表す。システム200で、エンタープライズ処理プラットフォーム204は複数のXコンテナ210を直接物理インフラストラクチャ214上に実装し、あらゆるハイパーバイザまたは他の仮想化インフラストラクチャをXコンテナ210とその基盤となる物理インフラストラクチャ214との間から除去し、後者の物理インフラストラクチャ214は例示として、ベアメタルホストまたは他のタイプのコンピュータまたはサーバとして実装される。システム200の他の要素は、他の場合は通常、
図1の100システムと連動して先に述べたものと同じである。
【0025】
それぞれの
図1および
図2で示すシステム100および200の特定の配置は開設の例としてだけ示されるものであって、多数の他の配置が可能であることは理解されよう。
【0026】
例えば、これらの実施形態がそれぞれのクラウドベースおよびエンタープライズ処理プラットフォームのXコンテナを実装するが、多種多様な追加的であるか代替の処理プラットフォーム、例えばモノのインターネット(IoT)プラットフォームおよびネットワーク機能仮想化(Network Function Virtualization、NFV)プラットフォームが使用可能である。
【0027】
他の例には、サービスとしてのプラットフォーム(PaaS)モデル、サービスとしてのソフトウェア(SaaS)モデル、サービスとしてのインフラストラクチャ(IaaS)モデルおよび/またはサービスとしての機能(FaaS)モデル、ならびにエンタープライズアプリケーションコンテナプラットフォーム、サーバレスコンピューティングプラットフォーム、マイクロサービスプラットフォームおよびクラウドベースのネイティブアプリケーションプラットフォーム、ならびにまた他の一般のクラウドコンピューティングまたはエンタープライズコンピューティングインフラストラクチャに従って実装されるプラットフォームが含まれる。さらに一般的に言えば、Xコンテナは、それらのセキュリティおよび性能の利点から恩恵を受けることができるいかなるプラットフォームにも実装することができる。
【0028】
Xコンテナ110または210を実装する際に、システム100または200は、例示として、本明細書において、「カーネルベースの分離層」と呼ばれるものを実装するように構成される。Xコンテナ110または210の所与の1つは、例示として、カーネルベースの分離層上のソフトウェアコンテナとして構成される。所与のXコンテナはライブラリオペレーティングシステムとして専用のオペレーティングシステムカーネルを含み、1つ以上のユーザプロセスが所与のXコンテナで実行される。カーネルベースの分離層は、いくつかの実施形態では、特にXコンテナの専用のオペレーティングシステムカーネルに対して、Xカーネルの形で実装される。Xカーネルは、より具体的には仮想マシンハイパーバイザまたはホストオペレーティングシステムの少なくとも一部を含むことができる。他のタイプのカーネルベースの分離層が、他の実施形態で使用可能である。
【0029】
図3は、例示の実施形態のXコンテナ310の例示の配置を含む、情報処理システム300の一部を示す。この例のXコンテナ310はより具体的には、すべてがXカーネル312に実装されている、第1第、2および第3のXコンテナ310-1、310-2および310-3を含む。
【0030】
上記のように、Xカーネルは、いくつかの実施形態では仮想マシンハイパーバイザ(例えば、Xen)を含むことができる。例えば、このタイプの所与の実施形態のXカーネル312は、
図1の仮想化インフラストラクチャ112の1つ以上の仮想マシンハイパーバイザを用いて実装することができる。仮想マシンは、本明細書において、それぞれのVMとも称される。
【0031】
他の実施形態のXカーネル312は、ホストオペレーティングシステムの少なくとも一部を含むことができる。例えば、このタイプの実施形態では、Linux(登録商標)カーネルまたはWindows OSカーネルを用いて、Xカーネルを実装することができる。このような実施形態は、例示として、直接
図2の物理インフラストラクチャ214上で動作する。
【0032】
一例として挙げるに過ぎないが、第1のXコンテナ310-1は単一のユーザプロセスを含み、第2のXコンテナ310-2は2つのユーザプロセスを含み、第3のXコンテナ310-3は3つのユーザプロセスを含む。異なる数および配置のXコンテナおよびそれらのそれぞれの関連するプロセスまたは複数プロセスが使用可能である。
【0033】
図3の実施形態の各Xコンテナ310は、図ではX-LibOSと記されているライブラリオペレーティングシステムとして、対応する専用のオペレーティングシステムカーネルを含む。X-LibOSは、例示として、指定されたタイプのモノリシックオペレーティングシステムカーネルから変換される。X-LibOSは、Xコンテナで実行している1つ以上のユーザプロセスの特権レベルと同じである特権レベルで、Xコンテナで動作する。X-LibOSは、例示として、本明細書において他でさらに詳細に後述するように、システムコールを対応する関数コールに変換することと連動して1つ以上のユーザプロセスのバイナリの自動翻訳をサポートするように構成される。
【0034】
上記のように、Xカーネル312上の各Xコンテナ310は、その対応するX-LibOSインスタンスとして別々の専用のオペレーティングシステムカーネルを含む。1つ以上のユーザプロセスの異なるセットは、Xコンテナ310のそれぞれのものにおいてそれらのそれぞれのX-LibOSインスタンスを用いて実行する。したがって、Xコンテナ310のいずれか1つにおいて実行しているユーザプロセスは、Xコンテナ310の他のものでそれぞれ実行しているユーザプロセスから、確実に分離される。
【0035】
Xカーネル312およびそれぞれのXコンテナ310のX-LibOSインスタンスの全てが、同じタイプのオペレーティングシステムを利用する必要はない。例えば、Xカーネル312およびX-LibOSインスタンスの所与の1つは、異なるタイプのそれぞれの第1および第2のオペレーティングシステムを用いて実装することができる。
【0036】
いくつかの実施形態では、Xカーネル312上のXコンテナ310の所与の1つがそのX-LibOSインスタンスとして専用のオペレーティングシステムカーネルを含むように構成することはさらに、既存のソフトウェアコンテナのコンテナイメージを抽出して、Xカーネル312上のXコンテナを構成する際の仮想マシンイメージとして抽出されたコンテナイメージを利用することを含む。このタイプの配置において、Xカーネル312上のXコンテナは、既存のソフトウェアコンテナのラッピングされたバージョンを含むことができる。このような実施形態の既存のソフトウェアコンテナの1つ以上のユーザプロセスは、例示として、それらの1つ以上のユーザプロセスのいかなる修正も必要とすることなく、Xカーネル312上の所与のXコンテナの1つ以上のユーザプロセスとして実行することを許可される。
【0037】
異なるタイプのXコンテナ310を、異なる実施形態で実装することができる。例えば、Xコンテナ310はいくつかの実施形態では、本明細書において準仮想化されたXコンテナまたはPV Xコンテナと称されるものとして実装されて、ライブラリオペレーティングシステムおよび1つ以上のユーザプロセスはユーザモードで動作する。このタイプのいくつかの実施形態は、例示として、他の場合は標準仮想マシンハイパーバイザまたはオペレーティングシステムカーネルであるものの修正されたバージョンとして、Xカーネル312を実装する。
【0038】
別の例として、他の実施形態のXコンテナは、本明細書においてハードウェアアシスト型仮想化XコンテナまたはHV Xコンテナと称されるものとして実装されて、ライブラリオペレーティングシステムおよび1つ以上のユーザプロセスはハードウェアアシスト型仮想マシンの中でカーネルモードで動作する。このタイプのいくつかの実施形態は、標準仮想マシンハイパーバイザまたはオペレーティングシステムカーネルとしてXカーネル312を実装する。このタイプの他の実施形態では、いくつかの修正が仮想マシンハイパーバイザまたはオペレーティングシステムになされ得る可能性がある。
【0039】
図3に図示される例示のXコンテナアーキテクチャは、ソフトウェアコンテナに改良された性能および分離を提供する。いくつかの実施形態では、Xコンテナアーキテクチャは、Linux(登録商標)カーネルなどの従来のモノリシックオペレーティングシステムカーネルを、Xコンテナの1つ以上のユーザプロセスと同じ特権レベルで動作するX-LibOSインスタンスに変える。異なるXコンテナの分離は、最小のトラステッドコンピューティングベースおよびカーネル攻撃対象領域によって保護される。
【0040】
従来のコンテナ実装とは異なり、Xコンテナ分離は、この20年の間に製造された大部分のIntelプロセッサに影響を及ぼす最近発見されたメルトダウン(Meltdown)CPUバグに影響されない。例示の実施形態は、この脆弱性および他のセキュリティ問題によって生じるコンテナ分離の問題を緩和するために用いることができる。
【0041】
Xコンテナはいくつかの実施形態では例示として、自動的にシステムコール命令を関数コールに翻訳するように構成され、それは、既存のコンテナが、いくつかの実施形態ではいかなる修正もなくXコンテナで動作することができるという点で、完全なバイナリ互換性のサポートを可能にする。
【0042】
Xコンテナは、従来のアプローチに対して強化された分離を示す。例えば、開示された配置は、所与のホスト上の危殆化されたコンテナがその同じホスト上の他のコンテナを危険にさらすのを防止する。Xコンテナは、既存のアプリケーションに対する安全なコンテナ分離だけでなく、上記のメルトダウン脆弱性などの緊急のコンテナセキュリティ問題に対するソリューションを提供する。
【0043】
上記のように、例示の実施形態のXコンテナは、Xカーネルに対して仮想マシンハイパーバイザまたはオペレーティングシステムカーネルを用いる(例えば、いわゆる「エクソカーネル」として役割を果たす)ことによって、これらおよび他の問題に対処する。従来のモノリシックオペレーティングシステムカーネル、例えばLinux(登録商標)カーネルは、例示として、ライブラリOSに変換されて、それは同じ特権レベルで1つ以上のユーザプロセスと共に動作する。
【0044】
ユーザプロセスのバイナリは、即座にパッチされて、システムコールを最適化された性能および完全なバイナリ互換性のための関数コールに翻訳することができる。
【0045】
既存のLinux(登録商標)コンテナ(例えば、Docker、LXC)は、コンテナディスクイメージを抽出して、仮想マシンイメージとしてそれを使用することによって、自動的にXコンテナにラッピングすることができる。
【0046】
Xコンテナアーキテクチャは、相互に信頼できないユーザからのプログラムの安全な分離および効果的な実行をサポートするパブリックコンテナクラウドまたはサーバレスコンピューティングプラットフォームにおいてだけでなく、多種多様な他のクラウドベースまたはエンタープライズ処理プラットフォームにおいても使用することができる。
【0047】
前述のように、XカーネルおよびX-LibOSインスタンスは、いくつかの実施形態では、異なるオペレーティングシステムタイプに基づいて実装することができる。例えば、XカーネルはXenに基づいて実装することができ、X-LibOSはLinux(登録商標)カーネルに基づいて実装することができる。
【0048】
いくつかの実施形態では、Xコンテナアーキテクチャは非常に効率的なLibOSとして役割を果たすために修正されたLinux(登録商標)カーネルを利用してそれにより完全な互換性を既存のアプリケーションおよびカーネルモジュールへ提供する一方で、ハイパーバイザまたはオペレーティングシステムカーネルをエクソカーネルとして用いて、Xコンテナを動作させて分離することができる。
【0049】
各Xコンテナは、例示として、Linux(登録商標)カーネルに基づいて、専用の、かつおそらくカスタマイズされたLibOSによってアプリケーションをホストする。Xコンテナは、1つ以上のユーザプロセスをサポートすることができ、1つ以上のユーザプロセスが同じ特権レベルのLibOSと共に動作する。異なるプロセスはリソース管理および互換性のためのそれら自体のアドレス空間を相変わらず有するが、しかし、プロセスが並列化のために用いられるという点で、それらは互いからの安全な分離をもはや提供せず、一方でXコンテナが分離を提供する。
【0050】
Xコンテナアーキテクチャは実行時の間、アプリケーションのバイナリを自動的に最適化して、高コストのシステムコールを非常により低コストのLibOSへの関数コールに書き換えることによって、性能を高める。Xコンテナは、ネイティブDockerコンテナと比較して生のシステムコールスループットが大幅に高く、他のベンチマークに対するネイティブコンテナと競合するかまたはより優れている。
【0051】
Xコンテナアーキテクチャは、コンテナおよびサーバレスサービスのために特化されたアーキテクチャも上回る。例えば、Xコンテナ、UnikernelおよびGraphene上でNGINXでwrkウェブベンチマークを動作させた。このベンチマークの下で、Xコンテナアーキテクチャは、Unikernelに相当する性能と、Grapheneの約2倍のスループットを有する。しかしながら、PHPおよびMySQLを動作させるときに、XコンテナアーキテクチャはUnikernelより大幅に良好な性能を示す。
【0052】
Xコンテナアーキテクチャがいくつかの実施形態ではLinux(登録商標)のソフトウェアベースの多くを利用する一方で、設計および実装は様々な課題に対処しなければならない。例示の実施形態は、複数の別個の例示の設計を含む。第1の例示の設計において、Xen上でユーザプロセスと一緒にユーザモードでLinux(登録商標)カーネルを動作させる。これは、Xenハイパーバイザに広範囲な修正を必要とするが、特別なハードウェアサポートを必要としない。実際、この設計は、ベアメタル上で、そして、パブリッククラウドの仮想マシン内部で動作することができる。第2の例示の設計において、Linux(登録商標)カーネルを利用しているハードウェア仮想化サポートと一緒にカーネルモードでユーザプロセスを動作させる。この設計は、いかなるハイパーバイザ上でも動作することができて、相変わらず確実に異なるコンテナを分離する。いずれの場合においても、Linux(登録商標)のアーキテクチャ依存的な部分だけしか修正しなくてよい。
【0053】
Xコンテナアーキテクチャは、いくつかの実施形態では、Linux(登録商標)コンテナと互換性があり、拮抗するかより優れた性能および分離をネイティブDockerコンテナならびに他のLibOSデザインに提供する、エクソカーネルベースのコンテナアーキテクチャを含む。さらに、このアーキテクチャは、互換性、ポータビリティまたは性能を犠牲にすることなくコンテナの安全な分離をサポートする。
【0054】
本明細書において開示されるXコンテナを使用して、ソフトウェアコンポーネントをパッケージ化して配信することができ、そしてサーバレスおよびマイクロサービスアーキテクチャの基本的なビルディングブロックとして、開発者がアプリケーションをその依存関係と共に1つのコンテナで出荷してそれが次にパブリックならびにプライベートクラウドのどこででも動作させられるという点での、ポータビリティなどの利点と、コンテナが仮想マシンと比較して無視できるほどのオーバーヘッドで数ミリ秒で起動できるという点での性能と、を提供することができる。多種多様な他の使用事例が、他の実施形態のXコンテナによってサポートされる。
【0055】
例示の実施形態のXコンテナが従来のアプローチに対して著しい利点を提供することは、上記のことから明らかである。例えば、Xコンテナは、従来のアプローチに対して大幅に改善した性能および分離を有するライブラリOSに基づいて、新規なセキュリティモデルを提供する。同じライブラリOSを共有している複数のプロセスがサポートされ、大きいクラスのコンテナにとって重要な特徴である。このアプローチにより、Linux(登録商標)カーネル自体をライブラリOS変換して、100%の互換性を提供する。例示の実施形態は、システムコールを最初の時だけリダイレクトして、それから自動的にそれらを関数コールに変換して、以降の実行を最適化する。例示の実施形態は、既存の変更されていないコンテナを実行することを可能にすると共に、性能のためにバイナリ自動的に最適化もする。さらに、このような実施形態は、攻撃対象領域およびTCBが著しく減少しており、したがって、より大幅に安全である。多種多様な異なる実装が可能であり、ハードウェア仮想化サポートのない実施形態を含む。
【0056】
本明細書において開示される上記のこれらおよび他の例示の実施形態の態様は、例としてのみ示されており、いかなる形であれ限定するものとして解釈されるべきではない。
【0057】
例示の実施形態の動作に関する追加の詳細は、ここで
図4~
図12を参照して記載される。
【0058】
複数ユーザおよびプロセスをサポートする最新のOSは、プロセスがカーネルの完全性を損なうこともできないし、カーネルに保持されている秘密情報を読み込むこともできないことを保証する、カーネル分離、および、1つのプロセスが容易にもう一方にアクセスすることができず、または損なうことができないことを保証する、プロセス分離を含む、様々なタイプの分離をサポートする。
【0059】
カーネル分離をセキュアにするためのコストは著しいものであり得る。カーネルコードにアクセスするシステムコールは、ライブラリへの関数コールより桁違いに遅い。さらに、しばしば、データコピーは、カーネルとユーザモードコードとの間のデータの依存性を排除するために、入出力(I/O)スタックで実行される。一方、ますます多くの機能性をOSカーネルに押し込む傾向があって、カーネルへの攻撃に対して防御するのはますます難しくなっている。Linux(登録商標)などの最新のモノリシックOSカーネルは、複雑なサービス、デバイスドライバおよびシステムコールインタフェースを有する巨大なコードベースになっている。このような複雑なシステムのセキュリティを検証することは実際的ではなく、新規な脆弱性が絶えず発見されている。
【0060】
プロセス分離は、同じように問題を含む。一例として、この種の分離は、それがどのように実装されて実施されるかにより、通常はカーネル分離に依存する。しかし、おそらくさらに重要なことに、プロセスは、単にセキュリティ分離だけを目的としない。それらは主にリソース共有および並列化サポートのために使われて、この最新のOSが、共有メモリ、共有ファイルシステム、シグナリング、ユーザグループおよびデバッグフックを含む、分離を越えるインタフェースを提供するのをサポートする。これらのメカニズムは大きい攻撃対象領域を露出させ、それはセキュリティ分離のためのプロセスに依存するアプリケーションに多くの脆弱性を生じさせる。
【0061】
例えば、Apacheウェブサーバは、同じユーザIDを有する子プロセスを生み出す。危殆化されたプロセスは、デバッグインタフェース(ptraceなど)またはprocファイルシステムに影響を及ぼすことによって、他のプロセスのメモリに容易にアクセスすることができる。注意深い構成無しでは、危殆化されたプロセスはまた、共有ファイルシステムにアクセスして、構成ファイルまたはデータベースからさえ情報を盗む可能性がある。最終的には、ハッカーがカーネルを危殆化することなく大部分のプロセス分離メカニズムを破るようにルート特権を得ることを可能にし得る、特権拡大攻撃が存在する。
【0062】
実際、ほとんどの既存のマルチクライアントアプリケーションは、相互の信頼できないクライアントを分離するプロセスに依存せず、特に、それらはプロセスを各クライアントに専用としない。全くプロセスさえ使用しないものも多い。例えば、NGINXウェブサーバ、Apache Tomcat、MySQLおよびMongoDBなどの人気のプロダクションシステムは、マルチプロセッシングの代わりにイベント駆動モデルまたはマルチスレッディングを使用する。Apacheウェブサーバなどのマルチプロセスアプリケーションはセキュリティではなく並列化のためにプロセスプールを使用し、その結果、各プロセスは複数スレッドを有して、異なるクライアントにサービスするために再利用することができる。これらのアプリケーションはアプリケーションロジックでクライアント分離を実行し、役割ベースのアクセス制御、認証および暗号化などのメカニズムを活用する。
【0063】
しかしながら、例外がある。SSHデーモンはプロセス分離に依存して、異なるユーザを分離する。また、同じカーネル上の同じMySQLデーモンを使用する複数のアプリケーションがある場合、各アプリケーションがMySQLに対する異なるクライアントのような態度をとるという点で、いくつかのアプリケーションが危殆化する場合に備えて、MySQLに組み込まれるプロセス分離およびクライアント分離の組合せはアプリケーションにセキュリティを提供する。
【0064】
本明細書において開示される例示の実施形態は、分離境界を再考することを必要とし、そのことは以下で
図4を参照して説明される。
【0065】
プロセスはリソース管理および並列化に役立つが、理想的にはセキュリティ分離はプロセスモデルから切り離されなければならない。実際、他の分離メカニズムが導入された。
【0066】
図4は、様々な他のアーキテクチャの分離境界を例示する。各コンテナがそのカーネルのそれ自身のインスタンス生成であると見えるように、コンテナ分離はカーネル上で名前空間を切り離す。しかしながら、用いられる技術は、コンテナで達成されることができるいかなる分離もコンテナ無しで達成することができるという点で、プロセス分離と基本的に同じである。それは、カーネルが、多くの利用可能なシステムコールのために大きい攻撃対象領域を有する大きくかつ脆弱なTCBであるという問題を解決しない。
【0067】
セキュリティ観点から、それぞれ独自の専用のカーネルを有する個々の仮想マシン(VM)においてコンテナを実行することは、可能なソリューションである。TCBはここで、非常に小さい攻撃対象領域を有する比較的小さいハイパーバイザから成る。残念なことに、冗長なリソース消費および分離境界のため、オーバーヘッドは大きい。それにもかかわらず、これは現在、マルチテナントコンテナクラウドのためのデファクトのソリューションである。このソリューションの高いコストを取扱うために、より多くの実験システム(例えばUnikernel、EbbRT、OSvおよびDune)は、VM内部で動作するように設計された軽量OSカーネルの選択肢である。残念なことに、これらは、バイナリレベルでの互換性の欠如のため、既存のアプリケーションを十分にサポートしない。また、通常、それらは、単一プロセスアプリケーションしかサポートすることができない。
【0068】
マイクロカーネルアーキテクチャにおいて、大部分の従来のOSサービスは、アプリケーションプロセスと一緒に別々のユーザプロセスで動作する。このようなアーキテクチャは、バイナリ互換性を提供することができる。しかしながら、異なるアプリケーションがそれらのOSサービスを共有するので、危殆化されたOSサービスはアプリケーションの間の分離を崩し、その結果、TCBおよび攻撃対象領域が減少しない。また、システムコールオーバーヘッドは、大きい傾向がある。
【0069】
本明細書の例示の実施形態のXコンテナアーキテクチャは、アプリケーションの間のセキュリティ分離に改良されたパラダイムを提供する。例えば、アーキテクチャは、いくつかの実施形態では、カーネル攻撃対象領域が小さくシステムコールオーバーヘッドが低いエクソカーネルアーキテクチャに基づく。個々のXコンテナは、例えば、リソース管理および並列化のために複数のプロセスを有することができるが、個々のXコンテナの中のそれらのプロセスは互いに分離されていない。その代わりに、ユーザおよび/またはアプリケーションは、異なるユーザおよび/またはアプリケーションのための別々のXコンテナを生み出すことによって、互いから分離される。Xコンテナの中での分離を無くすことによって、システムコールオーバーヘッドを関数コールのオーバーヘッドにまで低減することができる。
【0070】
上記のように、例示の実施形態のXコンテナは、完全なバイナリ互換性を有する標準OSカーネルに基づいて、X-LibOSを使用する。いくつかの実装において、X-LibOSは、Linux(登録商標)に由来して、Linux(登録商標)のアーキテクチャ依存的な部分の変更を必要とするだけである。標準カーネルを使用する利点は多数ある。例えば、Linux(登録商標)は、非常に最適化され、そして、成熟しており、活発なコミュニティによって開発されている。Xコンテナは、完全にこのような利点を活用するが、分離については非常に小さいXカーネルに依存している。いくつかの実装において、Xカーネルは、Xenに由来する。
【0071】
前述のように、異なるアプリケーションは、異なるXコンテナに置かれなければならない。
図5は、それぞれがMySQLデータベースを使用する2つのアプリケーションを含んでいる例示の実施形態の状況でこれを示す。
図5は、
図5(a)、
図5(b)および
図5(c)で示す3つの部分を含む。
【0072】
1つのオプションは、
図5(a)にて示すように、アプリケーションごとのXコンテナに加えて、MySQL専用の第3のXコンテナを作成することである。すなわち、このオプションは、MySQLをそれ自身の分離したアプリケーションとみなす。MySQLはアクセス制御ロジックを内部に含んで、確実に2つのアプリケーションのテーブルを分離する。
【0073】
より安全な構成は、MySQLの2つのインスタンスを作成し、アプリケーションごとに1つとし、それぞれがそれ自身のXコンテナで動作し、結果として、
図5(b)にて示すように、合計4つのXコンテナになる。これは、MySQL実装の中でアクセス制御ロジックに対する依存を取り除き、したがって厳密に構成のセキュリティを増大させる。加えて、このオプションは、MySQLサーバおよびそれらをサポートするオペレーティングシステムカーネルの両方のより良好なカスタマイズ可能性を提供する。
【0074】
しかしながら、
図5(b)の各アプリケーションがどのようにそれ自身のMySQLインスタンスを有するかについて留意する。各アプリケーションは、永続的にそのデータを格納して正しくクエリに応答するために、そのMySQLインスタンスに依存するが、逆に言えば、各MySQLインスタンスは専用であり、それ自身のアプリケーションによって危殆化されて失うものはない。したがって、
図5(c)に示すように、2つのXコンテナだけを安全に配備することができ、それぞれがその専用のMySQLインスタンスとともにアプリケーションロジックを含んでいる。このオプションは、それぞれ
図5(a)および
図5(b)に示される3つまたは4つのXコンテナ構成よりも著しく良好な性能を提供する。
【0075】
Xコンテナまたは一般にコンテナ上で動作するアプリケーションについては、外部および内部の2種類の脅威が考えられ、そしてこれらは、おそらく結託することができる。1つのタイプの外部の脅威は、アプリケーションロジックを損なうように設計されたメッセージによってもたらされる。この脅威は、アプリケーションおよびオペレーティングシステム論理によって対処されて、標準コンテナおよびXコンテナで同一である。別のタイプの外部の脅威は、コンテナの分離バリアを突破しようとすることができる。標準コンテナの場合、この分離バリアは基盤となる汎用オペレーティングシステムカーネルによって提供されており、それは大きいTCBおよび、多数のシステムコールに起因する大きい攻撃対象領域を有する。Xコンテナは、これとは対照的に、例示の実施形態の分離では、分離を提供することを専門とする比較的小さいXカーネルに依存する。それは、比較的保証するのが容易である小さいTCBおよび少数のハイパーバイザコールを有する。Xコンテナが標準コンテナ外部の脅威に厳密により良好な保護を提供すると信じられる。
【0076】
内部脅威は、サードパーティライブラリに依存しているアプリケーションによって作られるか、または、上記のMySQLの例で示すように、同じコンテナの中で展開されるサードパーティサービスによって作られる。Linux(登録商標)コンテナにおいて、アプリケーションは、異なるユーザアカウントによって所有されるプロセスの間の分離を実行するのをLinux(登録商標)にまかせる。Xコンテナは、同じコンテナのプロセスの間の安全な分離を明示的に提供しない。プロセスの間の安全な分離バリアに依存するアプリケーションは、競合するプロセスが異なるXコンテナで動作するように、標準VMおよびLinux(登録商標)ソリューションを使用するかまたはアプリケーションを再編成しなければならない。後者は、より堅固なセキュリティを提供するが、より多くの実装努力を必要とする。
【0077】
Xコンテナの例示の実施形態の追加の設計および実装の詳細を、ここで説明する。
【0078】
理想的には、コンテナは、アプリケーションを実行するための安全かつ自己内蔵型の環境を提供しなければならない。以下は、アプリケーションコンテナを安全に実行するためのアーキテクチャを設計する鍵となる原則である。
【0079】
1. 自給自足性およびカスタマイズ可能性:コンテナは、アプリケーションのすべての依存性を含まなければならない。これは、ライブラリ、ファイルシステムのレイアウトおよびサードパーティツールだけでなく、OSカーネルも含む。コンテナは、カスタマイズされたOSカーネルを使用してそれ自身のカーネルモジュールをロードしなければならない。
【0080】
2. 互換性:コンテナプラットフォームは、理想的にはアプリケーションの変更を必要とするべきでない。バイナリレベル互換性は、ユーザが、それらのアプリケーションを書きかえるかまたは再コンパイルすることさえなくただちにコンテナを配備することを可能にする。
【0081】
3. 小さいTCBによる分離:コンテナは、互いに確実に分離されなければならない。特権ソフトウェアを共有して共有物理リソースにアクセスすることが必要であるが、そのソフトウェアは信頼されており、かつ小さくなければならない。
【0082】
4. ポータビリティ:コンテナのキーとなる利点はそれらが一度パッケージ化されて、それから、ベアメタルマシンおよび仮想化されたクラウド環境を含む至る所で動作することができるということである。
【0083】
5. スケーラビリティおよび効率:アプリケーションコンテナは、軽量で、かつ小さなオーバーヘッドで実行されなければならない。
【0084】
本明細書において開示されるXコンテナのいくつかの実装においては、ハイパーバイザを使用してXカーネルとして役割を果たし、Linux(登録商標)カーネル配布を、それがアプリケーションと同じ特権モードで動作することを可能にするX-LibOSインスタンスに修正する。より具体的に以下の2つの例示の実装を解説する。
【0085】
1. ユーザモードでX-LibOSおよびアプリケーションを動作させる、準仮想化された(PV)Xコンテナ。このような実装は、例示として、(カーネルモードで動作する)ハイパーバイザの修正を必要とするが、それは特別なハードウェアサポートを必要とせず、ベアメタルマシンにならびにパブリッククラウドのVMにおいて配備することができる。
【0086】
2. カーネルモードでX-LibOSおよびアプリケーションを動作させる、ハードウェアアシスト型仮想化(HV)Xコンテナ。このような実装は、例示として、ハードウェア仮想化サポートを必要とするが、変更されていないハイパーバイザと連携する。
【0087】
上記の第1の実装例については、Xカーネル実装をXenに基づくものとした。Xenはオープンソースであり、Linux(登録商標)におけるその準仮想化インタフェースのサポートは成熟している。第2の実装例については、Xカーネルとしてハードウェア仮想化とともに変更されていないXenを使用するが、他のハイパーバイザも同様に使うことができる。例えば、Google Compute EngineのKVM上でHV Xコンテナを動作させた。
【0088】
両方の実装例は、有益な特徴を提供する。第1の実装は、Xコンテナが管理される方法のより大きな制御を可能にする。例えば、それにより、同じVMにおいて確実に互いから分離された複数のXコンテナを実行することが可能になる。単一の高性能VM上で複数のXコンテナを動作させることがより良好に実行され、それ自身の、より小さいVMにおいて各Xコンテナを動作させるよりも費用効果が良い。また、Xen VM管理機能性、例えばライブマイグレーション、コンソリデーションおよびメモリバルーニングは、付加的なボーナスとしてPV Xコンテナのためにサポートされ、これらは、従来のLinux(登録商標)コンテナにおいては十分にサポートされてない機能である。
【0089】
ハードウェア仮想化が利用できるときに、第2の実装はより良好な性能を有する傾向がある。しかしながら、仮想化された環境では、入れ子ハードウェア仮想化がサポートされない限り、HV Xコンテナは全部のVMを引き継ぐことを必要とする。パブリッククラウドのVMは、一般に入れ子ハードウェア仮想化を露出させない。
【0090】
本明細書において記載されている実験のために、Linux(登録商標)カーネル4.4.44からX-LibOSの両方のバージョンを得た。カーネルに対する修正は、アーキテクチャ依存的な層の中にあり、カーネルの他の層に対して透過的である。x86-64ロングモードで動作しているアプリケーションに焦点を当てた。
【0091】
Linux(登録商標)を使用することによってバイナリ互換性が与えられるが、加えて、Linux(登録商標)カーネルも高度にカスタマイズ可能である。それは、何百ものブートパラメータ、何千ものコンパイル構成および多くのきめ細かいランタイム調整ノブを備えている。大部分のカーネル機能がカーネルモジュールとして構成されて、実行時の間にロードすることができるので、カスタマイズされたLinux(登録商標)カーネルは高度に最適化することができる。例えば、多くのイベント駆動アプリケーションなどの単一スレッドを動作させるアプリケーションに対して、マルチコアおよび対称型マルチプロセシング(Symmetric Multiprocessing、SMP)サポートを無効にすることによって、不必要なロッキングおよび変換ルックアサイドバッファ(TLB)のシュートダウンを排除することができ、それは性能を大幅に高める。作業負荷に応じて、アプリケーションは、異なるスケジューリングポリシーを有するLinux(登録商標)スケジューラを構成することができる。多くのアプリケーションに対して、Linux(登録商標)カーネルのポテンシャルは、カーネル構成の管理欠如かまたは他のアプリケーションとカーネルを共有しなければないことに起因して、完全には利用されていなかった。Linux(登録商標)カーネルをLibOSに変えて、それを単一のアプリケーション専用にすることによって、すべてのこの種のポテンシャルを解き放つことができる。
【0092】
上記のPV Xコンテナの例示の実施形態を、ここで詳細に説明する。Xen準仮想化(PV)アーキテクチャに基づいて、PV Xコンテナを実装した。PVアーキテクチャはハードウェアアシスト型仮想化のためのサポート無しに同じ物理マシン上の複数の同時並行Linux(登録商標) VM(例えば、PVゲストまたはDomain-U)の実行を可能にするが、ゲストカーネルは基盤となるハイパーバイザと連携するため適度の変更を必要とする。以下において、XenのPVアーキテクチャの鍵となる技術およびx86-64プラットフォーム上でのその制約を検討する。
【0093】
PVアーキテクチャにおいて、Xenは最高特権モード(カーネルモード)で動作して、ゲストカーネルおよびユーザプロセスは両方ともより少ない特権で動作する。新規のページテーブルのインストールおよびセグメントセレクタの変更などの、セキュリティ分離に影響を及ぼし得るすべての機密性の高いシステム命令は、Xenによって実行される。ゲストカーネルはハイパーコールを実行することによってそれらのサービスを要求し、それはサービスが行われる前にXenによって有効性確認される。例外および割込みは、効率的なイベントチャネルを通して仮想化される。
【0094】
デバイスI/Oについては、ハードウェアをエミュレーションする代わりに、Xenは、より単純な分割ドライバモデルを定める。ハードウェアデバイスにアクセスしてデバイスを多重化する特権ドメイン(通常は、Domain-0、つまり、ブート中にXenによって作られるホストドメイン)があるので、それが他のDomain-Uによって共有できる。Domain-Uはフロントエンドのドライバをインストールして、それはXenのイベントチャネルを通してDomain-0の対応するバックエンドドライバに接続され、データは共有メモリ(非同期バッファ記述子リング)を用いて転送される。
【0095】
XenのPVインタフェースは、それがx86-32プラットフォーム上の最も効率的な仮想化技術の1つであったので、主流のLinux(登録商標)カーネルによって広くサポートされている。メモリセグメンテーション保護のための4つの異なる特権レベル(リング-0からリング-3)があるので、分離のための異なる特権レベルでXen、ゲストカーネルおよびユーザプロセスを動作させることができる。システムコールは、Xenの関与無しで実行することができる。しかしながら、PVアーキテクチャは、x86-64プラットフォーム上の基本的な課題に直面する。x86-64ロングモードのセグメント保護の削除のため、ゲストカーネルおよびユーザプロセスは両方ともユーザモードでしか動作させることができない。ゲストカーネルをユーザプロセスから保護するために、ゲストカーネルは、別のアドレス空間において分離されることが必要である。各システムコールは、仮想例外としてXenハイパーバイザによって転送することが必要であり、ページテーブルの切替えおよびTLBフラッシュを招く。これは、著しいオーバーヘッドを含んでおり、64ビットLinux(登録商標) VMが、ハードウェア仮想化において今日準仮想化の代わりに完全に仮想化して動作するのを好む、主要な理由の1つとなっている。
【0096】
PV Xコンテナのカーネル分離の削除に関する態様をここで説明する。
【0097】
PV Xコンテナアーキテクチャは、Xen PVアーキテクチャと類似しており、1つの鍵となる違いは、ゲストカーネル(すなわち、X-LibOS)がユーザプロセスから分離されていないということである。その代わりに、それらは同じセグメントセレクタおよびページテーブル特権レベルを使用し、そのため、カーネルアクセスが(ゲスト)ユーザモードと(ゲスト)カーネルモードの間の切替えをもはや必要とせず、システムコールは関数コールによって実行することができる。
【0098】
これが複雑化を引き起こし、Xenは、正しいsyscall転送および割込み伝達のために、CPUがゲストユーザモードにあるのかゲストカーネルモードにあるのかを知っていることを必要とする。Xenは、すべてのユーザ-カーネルモードスイッチがXenによって扱われるのでそれが維持することができるフラグを用いて、これを行う。しかしながら、X-LibOSでは、本明細書において記載されているような軽量システムコールおよび割込み処理によって、ゲストユーザ-カーネルモードスイッチはもはやXカーネルを含まない。その代わりに、Xカーネルは、現在のスタックポインタの位置をチェックすることによって、CPUがカーネルまたはプロセスコードを実行しているかどうか判定する。通常のLinux(登録商標)メモリレイアウトのように、X-LibOSは、仮想メモリアドレス空間の上半分にマップされて、すべてのプロセスによって共有される。ユーザプロセスメモリは、アドレス空間の下半分にマップされる。したがって、スタックポインタの最上位ビットは、それがゲストカーネルモードにあるかゲストユーザモードにあるかを指し示す。
【0099】
準仮想化されたLinux(登録商標)では、ページテーブルの「グローバルな」ビットは無効にされるので、異なるアドレス空間の間の切替えが完全なTLBフラッシュを引き起こす。これはX-LibOSには必要とされず、したがって、X-LibOSおよびXカーネルのためのマッピングは、ページテーブルでセットされるグローバルビットを両方とも有する。同じX-LibOS上で動作している異なるプロセス間の切替は完全なTLBフラッシュを必要とせず、それがアドレス変換の性能を非常に高める。異なるXコンテナ間のコンテクスト切替えは、完全なTLBフラッシュを起動する。
【0100】
カーネルコードがもはや保護されていないので、1つのプロセスしかない場合には、カーネルルーチンは専用のスタックを必要としないことになる。しかしながら、X-LibOSは、複数のプロセスをサポートする。したがって、まだカーネルの局面では専用のカーネルスタックを必要とし、システムコールを実行するときに、ユーザスタックからカーネルスタックへの切替えが必要である。
【0101】
PV Xコンテナの軽量割込み処理に関する態様をここで説明する。
【0102】
Xen PVアーキテクチャにおいて、割込みは、非同期イベントとして伝達される。Xenおよびゲストカーネルによって共有される、保留中のイベントが存在するかどうかについて指し示す変数がある。存在する場合には、ゲストカーネルはXenにハイパーコールを出して、それらのイベントを伝達させる。Xコンテナアーキテクチャにおいて、X-LibOSは、何らかの保留イベントを見つけると割込みスタックフレームをエミュレーションして、最初にXカーネルにトラッピングすることなく割込みハンドラに直接ジャンプすることが可能である。
【0103】
割込みハンドラから戻るために、iret命令を用いて、コードおよびスタックセグメント、スタックポインタ、フラグおよび命令ポインタを一緒にリセットする。割込みも、アトミックに有効にされなければならない。しかし、Xen PVアーキテクチャでは仮想割込みはメモリロケーションに書くことによってしか有効にすることができず、それは他の操作によってアトミックに実行することができない。特権レベルを切り替えるときにアトミック性およびセキュリティを保証するために、Xenは、iretを実装するためのハイパーコールを提供する。Xコンテナアーキテクチャにおいては、完全にユーザモードでiretを実装することができる。
【0104】
ユーザモードでiretを実装するときに、2つの課題がある。第1に、すべての汎用レジスタはリターンアドレスへジャンプバックする前に回復しなければならないので、一時的な値、例えばスタックおよび命令ポインタはレジスタの代わりにメモリに保存することしかできない。第2に、ハイパーコールを出さずに、仮想割込みは、他の操作によってアトミックに有効にすることができない。したがって、メモリに保存された一時的な値を操作しているコードは、リエントラント性をサポートしなければならない。
【0105】
考察すべき2つのケースがある。カーネルモードスタック上で動作している場所に戻るときには、X-LibOSは一時レジスタをリターンアドレスを含む行き先スタックにプッシュして、割込み許可の前にスタックポインタを切り替えるので、先取りが安全であると保証される。それから、コードは、単なるret命令を用いてリターンアドレスへジャンプする。ユーザモードスタックに戻るときには、ユーザモードスタックポインタは有効でないかもしれないので、X-LibOSはシステムコール処理のためにカーネルスタックに一時的な値を保存して、割込みを有効にして、それから、iret命令を実行する。iretと同様で、システムコールハンドラから戻るために使われるsysret命令は、カーネルモードにトラッピング無しで最適化される。sysretは、それが特定の一時レジスタを活用することができるので、実装するのがより容易である。
【0106】
上記のHV Xコンテナの例示の実施形態を、ここでさらに詳細に説明する。上記で説明したPV Xコンテナの大多数は、ページテーブル操作およびコンテクスト切替えを含むすべての機密性が高いシステム命令を、ハイパーコールを通して実行するためのコストが伴う。ハードウェア仮想化サポートが利用できる場合、HV Xコンテナはこのコストを省く。
【0107】
ハードウェア仮想化サポートによって、X-LibOSはカーネルモードで動作することができて、大部分の特権命令を直接実行することができ、それはページテーブル管理およびコンテクスト切替えの性能を非常に高める。大きな課題は、カーネルモードで同様にユーザプロセスを実行することから生まれる。ユーザプロセスがカーネルモードで動作することができるようにLinux(登録商標)カーネルでメモリおよびCPU管理コンポーネントを修正することに加えて、割込みおよび例外が扱われる方法も変えることが必要である。CPUがHV Xコンテナで直接割込みおよび例外を伝達するので、Xカーネルはそれらが扱われる方法を制御しない。x86プラットフォーム上のデフォルト動作は、カーネルモードの割込みまたは例外があるときに、スタック切替えが起こらないということである。これは割込みハンドラが直接ユーザスタック上で実行することができることを意味し、それはユーザコードおよびカーネルコードにおける基本的な仮定を破り、ユーザスタック上のデータは危殆化されることがあり得て、Linux(登録商標)カーネルの多くのコードは正しくこのような状況を扱うために変更することが必要となる。
【0108】
幸いにも、x86-64は割込みスタックテーブル(IST)と呼ばれる新規な割込みスタック切替えメカニズムを導入しており、割込みおよび例外時のスタック切替えを強制する。割込み記述子テーブル(IDT)にタグを指定することによって、特権レベルが変えられない場合であっても、CPUは新規なスタックポインタに切り替わる。しかしながら、入れ子割込みはこの場合同じスタックポインタが再利用されるなら、問題になる。この問題を、ISTにおいて一時スタックポインタを指定することによって解決した。割込みハンドラに入った直後に、スタックフレームを通常のカーネルスタックへコピーするので、同じスタックポインタが入れ子割込みのために使用できる。
【0109】
PVおよびHV Xコンテナの両方での軽量システムコールに関する態様をここで説明する。
【0110】
x86-64アーキテクチャにおいて、ユーザモードプログラムはシステムコールをsyscall命令を使用して実行し、それは制御をカーネルモードのルーチンへ移す。Xカーネルは制御をX-LibOSへ直ちに移し、バイナリ互換を保証するので、既存のアプリケーションがいかなる修正もなくX-LibOS上で動作することができる。
【0111】
X-LibOSおよびプロセスが両方とも同じ特権レベルで動作するので、直接システムコールハンドラを呼び出すことはより効率的である。しかしながら、GSセグメントの設定から課題が生じる。Linux(登録商標)カーネルは、CPUごとの変数をGSセグメントに格納する。このセグメントは、あらゆるシステムコールごとにカーネルに入る際にswapgs命令によって設定されて、ユーザプログラムに戻る前に再設定される。残念なことに、swapgs命令は、カーネルモードにおいてしか有効でない。セグメンテーションの使用を回避することによって、CPUごとの変数の配置を変えることができる。しかし、Linux(登録商標)カーネルに対する変更を最小限に保つために、X-LibOSに入るかまたはそれから出るときに、GSセグメント切替えをその代わりに無効にして、常にGSセグメントを有効に保つ。x86-64アプリケーションがスレッドローカルストレージ用のFSセグメントを使用するかもしれないが、GSセグメントは通常影響されない。カスタマイズされたGSセグメントを必要とするいかなるアプリケーションもまだ現れていない。
【0112】
別の課題が、軽量システムコールを有効にするメカニズムから生じる。X-LibOSはシステムコールエントリテーブルをvsyscallページに格納し、それはプロセスごとで固定仮想メモリアドレスにマップされる。X-LibOSを更新することは、システムコールエントリテーブルの位置に影響を及ぼさない。このエントリテーブルを使用して、アプリケーションは、ほとんどの既存のLibOSsが行うように、ソースコードをパッチしてシステムコールを関数コールに変えることによってXコンテナのためのそれらのライブラリおよびバイナリを最適化することができる。しかし、それによって配備の複雑さが著しく増加し、そしてそれは、利用可能なソースコードを有しないサードパーティツールおよびライブラリを処理することができない。アプリケーションを書き換えるかまたは再コンパイルすることを回避するために、PV Xコンテナ用のXカーネルに、そして、HV XコンテナのためのX-LibOSに、オンラインの自動最適化モジュール(Automatic Binary Optimization Module、ABOM)を実装した。それは、自動的に即座にsyscall命令を関数コールに置き換える。所定場所でのバイナリ置換のための多くの課題がある。
【0113】
1. バイナリレベルの等価性:パッチされた命令の全長は変えることができず、アプリケーションコードがパッチされたブロックの途中にジャンプするときでも、プログラムは正確に同じ機能を実行しなければならない。
【0114】
2. 位置独立性:glibcなどのライブラリが異なるプロセスのために異なる位置にロードされるので、相対アドレス変位の代わりにメモリまたはレジスタに格納された絶対アドレスをコールすることしかできない。
【0115】
3. 最小限の性能への影響:アプリケーションをロードするとき、または、実行時の間に、バイナリ全体をスキャンすることは実際的ではない。
【0116】
4. 読取り専用ページ処理:大部分のバイナリコードは、メモリにおいて読取り専用でマップされている。バイナリ置換はX-LibOSのコピーオンライトメカニズムを起動させることができず、そうでなければ、場合によっては、同じメモリページの多くのコピーが異なるプロセスに対して作成され得るかもしれない。
【0117】
5. 並列化安全性:コードの同じ部分は、異なるスレッドまたはプロセスを実行している複数のCPUによって共有され得る。置換は、他のCPUに影響を及ぼしたり停止させたりせずに、アトミックに行わなければならない。
【0118】
6. スワッピング安全性:メモリスワッピングは、置換の間に起こることがあり得る。システムは、メモリを危殆化するか、または大きな性能オーバーヘッドを引き起こすことなく、それを正しく検出して処理することができなくてはならない。
【0119】
ABOMは、ユーザプロセスからsyscall要求を受け取ると、即座にバイナリ置換を実行して、バイナリファイル全体をスキャンすることを回避する。syscall要求を転送する前に、ABOMは、syscall命令周辺でバイナリをチェックして、それが認識するパターンと一致するかどうかを見る。もし一致するならば、ABOMは一時的にCR-0レジスタの書込み保護ビットを無効にして、そのため、カーネルモードで動作しているコードは、あらゆるメモリページを、それがページテーブルにおいて読取り専用でマップされている場合であっても、変更することができる。それから、ABOMは、アトミックなcmpxchg命令によってバイナリパッチを実行する。各cmpxchg命令が処理できるのは多くても8バイトであるので、8バイトを超えて修正することを必要とする場合、バイナリのいかなる中間状態も並列化安全性のために相変わらず有効なことを確認することが必要である。パッチはX-LibOSに対して大部分透過的であるが、ページテーブルのダーティビットが読取り専用ページに設定されることは除く。X-LibOSは、同じパッチが将来必要でないように、それらのダーティページを無視するか、またはディスクにそれらをフラッシュすることのいずれかを選択することができる。
【0120】
より大きい問題は、スワッピング安全性を処理することである。特にPV Xコンテナでは、メモリスワッピングの決定がX-LibOSによりなされるが、すべてのページテーブル操作はXカーネルのハイパーコールを通して行われる。Xカーネルはページテーブルをロックしてバイナリ置換の間、スワッピングを防止することができるが、これによってより大きな性能オーバーヘッドが生じることがあり得る。結局以下の通りにバイナリ置換を実行することになった。バイナリ置換はシステムコールの場面で動作するので、対象ページが置換の直前にスワップアウトされる場合、ページへ書き込むことはページフォルトを起動させる。ABOMは、このページフォルトをキャプチャして、システムコールを、X-LibOSのページフォルトハンドラにそれを伝播することなく転送し続ける。ABOMは、それが次に実行されるときに、同じ位置をパッチしようとする。
【0121】
図6は、ABOMが認識するバイナリコードの3つのパターンを例示する。システムコールを実行するために、プログラムは、通常システムコール番号をmov命令でraxまたはeaxレジスタにセットして、それから、syscall命令を実行する。syscall命令は2バイトで、mov命令はオペランドのサイズにより5または7バイトである。絶対アドレスをメモリに格納した単一のコール命令にこれらの2つの命令を置き換え、それは7バイトで実装することができる。エントリポイントのメモリアドレスは、vsyscallページに格納されたシステムコールエントリテーブルから読み出される。バイナリ置換は、各場所につき一回、実行されることを必要とするだけである。
【0122】
7バイト置換によって、2つの命令を1つにマージする。プログラムが、raxレジスタを他の場所にセットした後か、または割込みの後に、直接元のsyscall命令の位置へジャンプするというまれな場合がある。置換の後、これによってコール命令の最後の2バイトへのジャンプが生じ、それは常に「0x60 0xff」である。これらの2バイトによって、Xカーネル(PV)またはX-LibOS(HV)への無効なオペコードトラップが生じる。バイナリレベルの等価性を提供するために、Xカーネル(PVの場合だけ)およびX-LibOSに特別なトラップハンドラを追加して、命令ポインタをコール命令の始まりへ後方に移動することによって、トラップを修正する。これが起動されるのが見られたことがあるのはいくつかのオペレーティングシステムのブート時の間だけである。
【0123】
図6にて示したように、9バイト置換は、2フェーズで実行され、それらの各1つが元のバイナリに等価の結果を生成する。mov命令が7バイトをとるので、それを直接syscallハンドラへのコールに置き換える。プログラムが直接それへジャンプする場合に備えて、元のsyscall命令を不変のままにすることができる。しかし、それを以前のコール命令へのジャンプでさらに最適化する。X-LibOSのsyscallハンドラは、リターンアドレス上の命令がsyscallまたはコール命令に対する特定のジャンプのいずれかであるかどうかを再び調べる。もしそうならば、syscallハンドラは、この命令をスキップするためにリターンアドレスを修正する。
【0124】
オンラインのバイナリ置換ソリューションは、syscall命令がmov命令に直ちに続くケースを扱うだけである。より複雑なケースについては、バイナリにいくつかのコードを入れ込んで、より大きいかたまりのコードをリダイレクトすることができる。オフラインでそれを行うためのツールも提供される。glibcなどの大部分の標準ライブラリに対しては、デフォルトシステムコールラッパは、
図6に示されるパターンを通常使用する。したがって、本実施形態は、クリティカルパス上の大部分のシステムコールラッパを最適化するのに十分である。
【0125】
PVおよびHV XコンテナのDockerイメージの軽量ブートストラッピングに関している態様をここで説明する。
【0126】
Xコンテナは、VMディスクイメージを有しておらず、VMが行う同じブートストラッピングフェーズを経由しない。Xコンテナをブートするために、Xカーネルは、メモリにX-LibOSに特別なブートローダをロードして、直接X-LibOSのエントリポイントへジャンプする。ブートローダは、IPアドレスをセットすることを含めて仮想デバイスを初期化して、そして次に、いかなる不必要なサービスも実行することなくコンテナのプロセスを生み出す。コンテナの第1のプロセスは、必要に応じて追加プロセスをフォークすることができる。加えて、HV X-LibOSには、GNU GRand Unified Bootloader(GRUB)によって、基盤となるハイパーバイザの助け無しに特別なブートローダをロードすることもできる。このアプローチは、Xコンテナを通常のVMより小さくし、かつブートをより高速にする。例えば、64MBのメモリサイズで3秒以内に単一のbashプロセスを有する新規なUbuntu-16 Xコンテナを生み出すことが可能である。
【0127】
Xコンテナがバイナリレベル互換性をサポートするので、修正無しでいかなる既存のDockerイメージも動作させることができる。XコンテナアーキテクチャをDocker WrapperによってDockerプラットフォームに接続する。ホストXコンテナにおいて動作している変更されていないDockerエンジンを用いて、Dockerイメージをプルしてビルドする。デバイスマッパーをストレージドライバとして使用し、それはDockerイメージの異なる層をシンプロビジョニングされたコピーオンライトスナップショットデバイスとして格納する。それから、Docker Wrapperは、Dockerからメタデータを読み出して、シンブロックデバイスを作成して、それを新規なXコンテナに接続する。次に、コンテナのプロセスは、専用のX-LibOSによって生み出される。
【0128】
上記の特定の例示の実施形態の例示の実装は、これらの例示の実施形態の様々な利点を示すために、従来の配置に対して評価された。
【0129】
図7は、例示の実施形態のこの評価において利用されるソフトウェアスタックの例を示す。この図において、点線ボックスは、DockerコンテナまたはXコンテナを示す。実線は、特権レベルの間の分離境界を示す。点線は、ライブラリインタフェースを示す。
【0130】
評価の一部として、両方のベアメタルマシンおよびパブリッククラウドのVM上で実験を行った。ベアメタル実験に対しては、4台のデルPowerEdge R720サーバ(2個の2.9GHzのIntel Xeon E5-2690 CPU、16個のコア、32個のスレッド、96GBのメモリ、4TBディスク)を使用し、1つの10Gbitスイッチに接続した。クラウド環境に対しては、アマゾンEC2ノースヴァージニア領域(m3.xlargeインスタンス、2個のCPUコア、4個のスレッド、15GBのメモリおよび2台の40GBのSSDストレージ)において4つのVMの実験を動作させた。
【0131】
ベースラインとして、ベアメタル上とアマゾンHVマシンの両方でDockerコンテナプラットフォームを動作させた。これらの2つの構成をそれぞれDocker/ネイティブ/ベアおよびDocker/ネイティブ/クラウドと呼ぶ。我々は、個々のXen HVおよびPV Domain-U VMで動作するDockerコンテナに対して、そして、Xコンテナに対して、それらの性能を対比した。これによって、6つの追加構成、Docker/HV/ベア、Docker/PV/ベア、Xコンテナ/HV/ベア、Xコンテナ/PV/ベア、Xコンテナ/HV/クラウドおよびXコンテナ/PV/クラウドとなった。
図7は、これらの構成の様々なソフトウェアスタックを示す。なお、これらの8つの構成の中で、3つはクラウド内で、そして5つはベアメタル上で動作する。
【0132】
ネイティブDockerを実行するホスト(物理マシンまたはアマゾンEC2インスタンス)は、Dockerエンジン17.03.0-ceおよびLinux(登録商標)カーネル4.4.44によってインストールしたUbuntu 16.04LTSを有した。Xen VMを実行するホストは、Domain-0にインストールされたCentOS-6およびDockerエンジン17.03.0-ce、Linux(登録商標)カーネル4.4.44およびXen 4.2によるDomain-UのUbuntu 16.04-LTSを有した。Xコンテナを実行するホストは、Linux(登録商標)カーネル4.4.44に基づくX-LibOSおよびHost XコンテナとしてのCentOS-6を使用した。Dockerコンテナは、デフォルトのNUMA対応Linux(登録商標)スケジューラを、IRQ-バランスサービスをオンにして使用した。Domain-0およびHost Xコンテナは専用のCPUコアで構成されて、異なるコアに手動でIRQのバランスをとった。他のVMまたはXコンテナは、NUMA配置に従って他のCPUコアに均一に配布された。
【0133】
実験のセットごとに、同じDockerイメージが使われた。Dockerエンジンは全て、デバイスマッパーストレージドライバによって構成された。クライアントまたはサーバを含んだネットワークベンチマークを実行するときに、分離されたマシンまたはVMが用いられた。
【0134】
Xコンテナで動作しているアプリケーションがX-LibOSを完全に制御するので、それらは単一のスレッド型だけがビジーであるときに、対称型マルチプロセシング(Symmetric Multiprocessing、SMP)およびマルチコアサポートを無効にすることができる。この最適化は多くの場合大幅に性能を高めることができ、並列化管理およびTLBシュートダウンを排除することができる。Dockerコンテナで動作しているアプリケーションは、それがルート特権を必要とするので、この種の最適化をすることができない。続くマイクロベンチマークおよびマクロベンチマークにおいて、単一プロセスおよびマルチプロセステストを行った。単一プロセスケースに対してX-LibOSのSMPサポートを無効にした。
【0135】
本明細書において記載されている大部分の実験について、5つの動作の平均を報告し、さらに標準偏差を示す。
【0136】
マイクロベンチマークのセットによってXコンテナの性能を評価した。Ubuntu16 Dockerイメージから始めて、UnixBenchおよびその中のiperfを実行した。Execlベンチマークはexecシステムコールの速度を計測するものであり、それは新規なバイナリを現行プロセスの上にオーバレイする。File Copyベンチマークは、ファイルのコピーのスループットを異なるバッファサイズでテストする。Pipe Throughputベンチマークは、パイプにおける読込みおよび書込みのスループットを計測する。PipeベースのContext Switchingベンチマークは、パイプで通信している2つのプロセスの速度をテストする。Process Creationベンチマークは、forkシステムコールによって新規なプロセスを生み出すことの性能を測定する。System Callベンチマークは、dup、close、getpid、getuidおよびumaskを含む一連のシステムコールを発行する速度をテストする。最後に、iperfベンチマークは、TCP転送の性能をテストする。同時並行テストについては、ベアメタル実験では4つのコピーを、そしてEC2インスタンスが2つのCPUコアしか持たないので、アマゾンEC2では2つのコピーを実行した。
【0137】
図8は、上記のマイクロベンチマークに対する様々な
図7の構成の相対性能を示す。
図8は、
図8(a)、
図8(b)、
図8(c)および
図8(d)で示される4つの部分を含む。
【0138】
システムコールを軽量関数コールに変えたので、Xコンテナが著しくより高いシステムコールスループットを有することが全般的に分かった。単一プロセスベンチマークについては、SMPサポートを無効にすることによってX-LibOSを最適化して、その結果、XコンテナはDockerを大幅に上回っている。Xコンテナ/PVは、プロセス作成およびコンテクストスイッチングにおいて、特にアマゾンEC2などの仮想化された環境のDocker/ネイティブと比較して、著しいオーバーヘッドを有した。これはプロセス作成およびコンテクストスイッチが多くのページテーブル操作を必要とするのが理由であり、それはXカーネルで行わねばならない。Xコンテナ/HVは、このオーバーヘッドを取り除いて、Docker/ネイティブおよびDocker/HV/ベアよりも良好な性能を達成した。Docker/HV/ベアは、ディスクキャッシングの余分の層があるので、ファイルコピーベンチマークのDocker/ネイティブ/ベアよりも良好な性能を達成する。
【0139】
2つのマクロベンチマークによるXコンテナの性能も評価したが、その評価結果を
図9に示す。
図9は、
図9(a)、
図9(b)、
図9(c)および
図9(d)で示される4つの部分を含む。NGINXウェブサーバスループットに対する評価結果は
図9(a)および
図9(b)に示され、カーネルコンパイル時間に対する評価結果は
図9(c)および
図9(d)に示される。
【0140】
NGINXサーバについては、すべてのプラットフォーム上でDockerイメージNGINX:1.11を動作させた。wrkベンチマークを使用して、NGINXサーバのスループットを単一および複数のワーカープロセスでテストした。wrkクライアントは、NGINXサーバでワーカープロセスごとに10本のスレッドおよび100の接続を開始した。ベアメタルマシン上で、DockerコンテナおよびXコンテナは、ブリッジされたネットワークを使用したが、直接クライアントに接続することができる。アマゾンEC2上で、それらは、ポート転送によるプライベートネットワークを使用した。なお、Xコンテナ/HV/クラウドがEC2のHVM全体にとって代わるので、それはポート転送無しにネットワークにアクセスした。カーネルコンパイルテストについては、Ubuntu-16.04 Dockerイメージを使用して、それにコンパイルツールをインストールした。「小さい」構成によって最新の4.10のLinux(登録商標)カーネルをコンパイルした。同時並行テストは、ベアメタル実験で4つの並列ジョブおよびアマゾンEC2実験で2つの並列ジョブを動作させることによって実行される。
【0141】
図9(a)および
図9(b)は、ベアメタルマシンおよびアマゾンEC2上で計測されるNGINXウェブサーバスループットを示す。Xコンテナは、カーネルカスタマイズおよび低減されたシステムコールオーバーヘッドのため、Xen VM内部のDockerコンテナより一貫して優れていた。単一のワーカープロセスを実行するときに、Xコンテナ/PV/ベアおよびXコンテナ/HV/ベアはSMPサポートを無効にすることによってさらに最適化されて、Docker/ネイティブ/ベアコンテナよりもそれぞれ5%および23%高いスループットを達成した。ベアメタル上で同時並行ワーカープロセスを実行すると、Xコンテナの性能はDocker/ネイティブ/ベアコンテナと同等だった。アマゾンEC2において、Xコンテナ/HV/クラウドは、それがHVM全体にとって代わりポート転送無しで動作したので、Docker/ネイティブ/クラウドよりも69%~78%高いスループットを達成した。コンテクストスイッチのオーバーヘッドのため、Xコンテナ/PV/クラウドは、Docker/ネイティブ/クラウドと比較して同時並行テストの20%の性能損失があった。この結果は、ネットワークI/O集中型の作業負荷に対して、XコンテナがVMより性能が良く、そして多くの場合、ネイティブDockerコンテナよりもさらに性能が良いことを示す。
【0142】
図9(c)および
図9(d)は、ベアメタルマシンおよびアマゾンEC2インスタンス上のカーネルコンパイル時間を示し、下位カーネルコンパイル時間は上位カーネルコンパイル時間よりも良い。NGINX実験と同様で、ベアメタルマシン上の単一プロセスXコンテナは、ネイティブで動作するかまたはVM内で動作しているDockerコンテナより大幅に性能が良い。アマゾンEC2では同様の改善は見られなかったが、入出力スケジューリングの別の層によるものと思われる。PV Xコンテナの性能は準仮想化された環境のページテーブル管理の高オーバーヘッドのため、僅かに損なわれて、forkおよびexecなどの動作を遅くした。この結果は、CPU集中型の作業負荷に対して、より軽量のシステムコールから得ることができる性能の利点が制限されるが、性能向上はまだカーネルカスタマイズによって可能であることを示す。
【0143】
Xコンテナの例示の実施形態は、GrapheneおよびUnikernelとも比較されて、その結果が
図10に示されている。
図10は、
図10(a)、
図10(b)および
図10(c)と示された3つの部分を含む。
【0144】
これらの比較のために、ベアメタルマシン上でNGINXウェブサーバ、PHPおよびMySQLデータベースによるwrkベンチマークを動作させた。Grapheneは、Ubuntu-16.04によってLinux(登録商標)上で動作して、セキュリティ分離モジュール無しでコンパイルされた(これはその性能を改善するはずである)。Unikernelに対しては、Rumprunを使用したが、その理由は、それが軽微なパッチでそれらのアプリケーションを動作させることができるからである(MirageOSによる実行はOCamlでアプリケーション全体を書き直すことを必要とする)。UnikernelはXen HVでの動作をサポートしないので、それをPVモードでテストしただけである。
【0145】
図10(a)は、単一のワーカープロセスを有する静的ウェブページのために役立つNGINXウェブサーバのスループットを比較する。1つのNGINXサーバプロセスしか動作していないので、SMPを無効にすることによってXコンテナを最適化した。Xコンテナは、Unikernelに相当するスループット、そして、Grapheneのスループットの2倍を超えるスループットを達成した。
【0146】
図10(b)は、単一のNGINXウェブサーバの4つのワーカープロセスを実行するケースを示す。これはUnikernelによってサポートされないので、Grapheneに対してだけ比較した。この場合、Xコンテナは、Grapheneより50%超高性能だった。Grapheneの性能は限定されたが、それは、Grapheneでは複数のプロセスがIPCコールを使用して共有POSIXライブラリへのアクセスを調整し、それによって著しいオーバーヘッドが生じるからである。
【0147】
前に
図5に関連して記載されているシナリオを評価したが、そこでは、2つのPHP CGIサーバがMySQLデータベースに接続されている。PHPの組み込みウェブサーバを有効にして、wrkクライアントを使用して、データベースに(読み出しと書き込みに対して等しい確率を有する)要求を出したページにアクセスした。
図5に示すように、PHPサーバは、データベースを共有するかまたは分離されたデータベースを有することができる。GrapheneはPHP CGIサーバをサポートしないので、Unikernelに対してだけ比較した。2つのPHPサーバのトータルスループットは、異なる構成によって計測されたが、その結果を
図10(c)に示す。すべてのVMは、1つのCPUコアで単一プロセスを実行していた。3VMおよび4VM構成では、Xコンテナは、Unikernelより40%超高性能であった。これはLinux(登録商標)カーネルがRumprunカーネルよりもよく最適化されるという理由であると思われる。さらに、Xコンテナは単一のコンテナにおいてPHPおよびMySQLの実行をサポートするが、それはUnikernelでは可能でない。この便利さが性能にも著しく役立ち、Xコンテナスループットは、Unikernel設定の約3倍のスループットであった。
【0148】
例示の実施形態のスケーラビリティ評価も実行されて、その結果が
図11に示されている。
【0149】
1つの物理マシン上で最大400のコンテナを実行することによって、Xコンテナアーキテクチャのスケーラビリティを評価した。この実験のために、PHP-FPMエンジンを有するNGINXサーバを使用した。webdevops/PHP-NGINX Dockerイメージを使用して、単一のワーカープロセスによってNGINXおよびPHP-FPMを構成した。wrkベンチマークを動作させて、すべてのコンテナのトータルスループットを計測した。各コンテナは5つの同時接続を有する専用のwrkスレッドを備えており、したがって、wrkスレッドおよび同時接続の合計数はコンテナの数によって直線的に増加する。
【0150】
各Xコンテナは、SMPサポートを無効にすることによってX-LibOSを最適化して、単一の仮想CPUおよび128MBのメモリで構成された。Xコンテナはより少ない量のメモリ(例えば、64MBのメモリ)で作動することができるが、128MBのメモリサイズは400個のXコンテナをブートするのに十分に小さいという点に留意する必要がある。Docker/HV/ベアおよびDocker/PV/ベアのために、各Xen VMは、1つの仮想CPUおよび512MBのメモリを割り当てられた(512MBはUbuntu-16 OSのための推奨の最小サイズである)。しかしながら、物理マシンが96GBのメモリを備えているだけであるので、200を超えるVMを開始するときに、VMのメモリサイズを256MBに変えなければならなかった。VMがそれでもブートすることができるとわかったが、ネットワークスタックはパケットをドロップし始めた。Xen上で250を超えるPVインスタンスまたは200を超えるHVインスタンスを正しくブートすることができなかった。
【0151】
図11は、すべてのベアメタル構成の総スループットを示す。Docker/ネイティブ/ベアコンテナが少数のコンテナに対してより高いスループットを達成したことが分かる。これは、Dockerコンテナ間のコンテクストスイッチングが、Xコンテナ間およびXen VM間よりも安価であるからである。しかしながら、コンテナの数が増加したのにつれて、Dockerコンテナの性能はより早く低下した。これは、各NGINX+PHPコンテナが4つのプロセスを実行したからであり、N個のコンテナで、Dockerコンテナを動作させているLinux(登録商標)カーネルは4N個のプロセスをスケジューリングしていたが、Xカーネルは、それぞれが4つのプロセスを実行しているN個の仮想CPUをスケジューリングしていた。この階層的なスケジューリングは一緒に多くのコンテナをスケジューリングする、よりスケーラブルな方法であることがわかって、N=400では、Xコンテナ/PV/ベアはDocker/native/bareを18%上回った。
【0152】
評価はカーネルカスタマイズの追加的な性能の利点をさらに示したが、そのことはここで
図12を参照して説明する。Xコンテナの例示の実施形態は、カスタマイズされたカーネルモジュールを必要とするアプリケーションコンテナを有効にする。例えば、Xコンテナは、ソフトウェアRDMA(Soft-iwarpおよびSoft-ROCEの両方)アプリケーションを使用することができる。Docker環境において、このようなモジュールはルート特権を必要とし、直接ホストネットワークをコンテナにさらして、セキュリティの懸念を増大させる。
【0153】
我々は、シナリオを3台のNGINXウェブサーバおよび1台のロードバランサでテストした。NGINXウェブサーバは、それぞれ1つのワーカープロセスを使用するように構成されている。Dockerプラットフォームは、通常、HAProxyなどのユーザレベルロードバランサを使用する。HAProxyは、生産システムで広く配備されている単一スレッドのイベントドライバプロキシサーバである。Xコンテナは、HAProxyをサポートするが、IPVS(IP仮想サーバ)などのカーネルレベルロードバランシングソリューションを使用することもできる。IPVSは新規なカーネルモジュールを挿入して、iptableおよびARPテーブルルールを変えることを必要とし、それはホストネットワークにルート特権およびアクセスがないDockerコンテナにおいては可能でない。
【0154】
この実験では、我々は、HAProxy:1.7.5 Dockerイメージを使用した。ロードバランサおよびNGINXサーバは、同じ物理マシン上で動作していた。各Xコンテナを単一の仮想CPUで構成し、性能の最適化のためにX-LibOSにおいてSMPサポートをオフにした。我々は、wrk作業負荷発生器を使用して、トータルスループットを計測した。
【0155】
図12は、様々な構成を比較している。HAProxyを有するXコンテナプラットフォームは、Dockerコンテナプラットフォームのスループットの2倍を達成した。NATモードを使用するIPVSカーネルレベルロードバランシングによって、Xコンテナは、処理能力をさらに12%高める。この場合、ロードバランサは、それがウェブフロントエンドおよびNATサーバの両方の役割だったので、ボトルネックであった。IPVSは、「直接ルーティング」と呼ばれる別のロードバランシングモードをサポートしている。直接ルーティングによって、ロードバランサはバックエンドサーバに要求を送り届けることを必要とするだけであるが、バックエンドサーバからの応答はクライアントに直接送られる。これは、iptableルールを変えて、カーネルモジュールをロードバランサおよびNGINXサーバの両方に挿入することを必要とする。直接ルーティングモードによって、ボトルネックはNGINXサーバにシフトされ、トータルスループットはさらに1.5倍改善された。
【0156】
上記の評価に関連して記載されている特定のXコンテナの実施形態が例に過ぎず、例示の実施形態の利点を示すことを意図しており、いかなる形であれ制限するものとして見られるべきでないことが理解されよう。
【0157】
図1~
図12に関連して図と共に示されて説明される特定の配置が図示例のみによって表されたものであり、そして多数の別の実施形態が可能であることが理解されよう。したがって、本明細書において開示される様々な実施形態は、いかなる形であれ制限するものとして解釈されるべきでない。ソフトウェアコンテナを実装する多数の代替的な配置が、他の実施形態で利用され得る。例えば、他のタイプのカーネルベースの分離層が、特定の例示の実施形態に関連して記載されている特定のXカーネルの配置の代わりに使用可能である。当業者であれば、他の処理操作および関連するシステム実体構成が他の実施形態で使用可能であることも認めるであろう。
【0158】
そのため、他の実施形態が例示の実施形態の構成要素に対して、追加的または代替のシステム要素を含むことができる可能性がある。したがって、特定のシステム構成ならびに関連ソフトウェアコンテナおよびカーネルベースの分離層実装は、他の実施形態で変化することができる。
【0159】
本明細書において記載されている情報処理システムの所与の処理デバイスまたは他のコンポーネントは、例示として、メモリに結合されたプロセッサを備えた対応する処理デバイスを利用して構成される。プロセッサは、処理操作および他の機能性の性能を制御するためにメモリに格納されているソフトウェアプログラムコードを実行する。処理デバイスは、1つ以上のネットワークの上の通信をサポートするネットワークインタフェースも含む。
【0160】
プロセッサは、例えば、マイクロプロセッサ、ASIC、FPGA、CPU、ALU、GPU、DSPまたは他の類似の処理デバイスコンポーネント、ならびに他のタイプおよび配置の処理回路を、任意の組合せで含むことができる。例えば、本明細書において開示される所与の処理デバイスは、このような回路を用いて実装することができる。
【0161】
メモリは、処理デバイスの機能性の一部を実施する際にプロセッサによって実行するためのソフトウェアプログラムコードを格納する。所与の、対応するプロセッサによって実行するためのこのようなプログラムコードを格納するこのようなメモリは、本明細書においてさらに一般的には、その中で実施されるプログラムコードを有するプロセッサ可読ストレージ媒体と称されるものの例であり、例えば、SRAM、DRAMまたはその他のタイプランダムアクセスメモリ、ROM、フラッシュメモリ、磁気メモリ、光メモリまたは任意の組合せの他のタイプのストレージデバイスなどの、電子メモリを含むことができる。
【0162】
前述のように、このようなプロセッサ可読ストレージ媒体を含む製品は、本発明の実施形態と考えられる。「製品」という本明細書で用いられる用語は、一過性の伝播信号を除外するものと理解しなければならない。プロセッサ可読ストレージ媒体を含む他のタイプのコンピュータプログラム製品は、他の実施形態で実装することができる。
【0163】
加えて、本発明の実施形態は、カーネルベースの分離層上のソフトウェアコンテナを提供することと関連した処理操作を実装するように構成された処理回路を含む、集積回路の形で実装することができる。
【0164】
本明細書において開示される情報処理システムは、1つ以上の処理プラットフォームまたはその一部を使用して実装することができる。
【0165】
例えば、情報処理システムの少なくとも一部を実装するために用いることができる処理プラットフォームの1つの例示の実施形態は、物理インフラストラクチャ上で動作するハイパーバイザを用いて実装される仮想マシンを含むクラウドインフラストラクチャを含む。このような仮想マシンは、1つ以上のネットワーク上で互いに通信するそれぞれの処理デバイスを含むことができる。
【0166】
このような実施形態のクラウドインフラストラクチャは、ハイパーバイザの管理下の仮想マシンのそれぞれのものの上で動作するアプリケーションの1つ以上のセットをさらに含むことができる。少なくとも1つの基盤となる物理マシンを用いてそれぞれ1セットの仮想マシンを提供している、複数のハイパーバイザを使用することもできる。1つ以上のハイパーバイザにより提供される仮想マシンの異なるセットは、情報処理システムの各種コンポーネントの複数のインスタンスを構成する際に利用することができる。
【0167】
本明細書において開示した情報処理システムの少なくとも一部を実装するために使うことができる処理プラットフォームの別の例示の実施形態は、少なくとも1つのネットワーク上で互いに通信する複数の処理デバイスを含む。処理プラットフォームの各処理デバイスは、メモリに結合されたプロセッサを含むとみなされる。
【0168】
また、これらの特定の処理プラットフォームは例として示されているだけであり、情報処理システムは、追加または代替の処理プラットフォームならびに多数の別個の処理プラットフォームを任意の組合せで含むことができて、それぞれのこのようなプラットフォームは、1つ以上のコンピュータ、サーバ、ストレージデバイスまたは他の処理デバイスを含んでいる。
【0169】
例えば、本発明の実施形態を実装するために用いる他の処理プラットフォームは、仮想マシンを含んでいる仮想化インフラストラクチャの代わりに、または、それに加えて、異なるタイプの仮想化インフラストラクチャを含むことができる。したがって、いくつかの実施形態では、システムコンポーネントは、少なくとも部分的にクラウドインフラストラクチャまたは他のタイプの仮想化インフラストラクチャで動作することができる、という可能性がある。
【0170】
したがって、他の実施形態で、追加または代替の要素の異なる配置が使用可能であると理解すべきである。少なくともこれらの要素のサブセットは共通の処理プラットフォームに集合的に実装されてもよく、または、それぞれのこのような要素が別々の処理プラットフォームに実装されてもよい。
【0171】
また、コンピュータ、サーバ、ストレージデバイスまたは他のコンポーネントの多数の他の配置が、情報処理システムにおいて可能である。このようなコンポーネントは、任意のタイプのネットワークまたは他の通信媒体上の情報処理システムの他の要素と通信することができる。
【0172】
前述のように、本明細書において開示されるシステムのコンポーネントは、少なくとも部分的に、メモリに格納されて処理デバイスのプロセッサによって実行される1つ以上のソフトウェアプログラムの形で、実装することができる。例えば、本明細書において開示される特定の機能性は、少なくとも部分的にソフトウェアの形で実装することができる。
【0173】
本明細書において記載されている情報処理システムの特定の構成は例示的なものでしかなく、他の実施形態のこのような所与のシステムは、具体的に示されている要素に加えるか、またはその代わりの他の要素を含むことができ、その中にはこのようなシステムの従来の実装で一般に見られるタイプの1つ以上の要素を含む。
【0174】
例えば、いくつかの実施形態では、情報処理システムは、開示された技術を利用して他の状況において追加であるか代替の機能性を提供するように構成することができる。
【0175】
本明細書において記載されている本発明の実施形態が例示することだけを意図していることを再び強調しなければならない。本発明の他の実施形態は、本明細書において説明されている特定の例示の実施形態および多数の他の状況で利用されているものとは異なる、多種多様なタイプおよび配置の情報処理システム、ネットワークおよびデバイスを利用して実装することができる。加えて、本明細書において特定の実施形態を説明する前後関係でなされる特定の仮定は、他の実施形態に適用する必要はない。これらおよび多数の他の別の実施形態は、当業者にとって直ちに明らかなものである。