本発明は、処理、装置、システム、物質の組成、コンピュータ読み取り可能な格納媒体上に具現化されたコンピュータプログラム製品、および/または、プロセッサ(プロセッサに接続されたメモリに格納および/またはそのメモリによって提供される命令を実行するよう構成されたプロセッサ)を含め、様々な形態で実装されうる。本明細書では、これらの実装または本発明が取りうる任意の他の形態を、技術と呼ぶ。一般に、開示された処理の工程の順序は、本発明の範囲内で変更されてもよい。特に言及しない限り、タスクを実行するよう構成されるものとして記載されたプロセッサまたはメモリなどの構成要素は、ある時間にタスクを実行するよう一時的に構成された一般的な構成要素として、または、タスクを実行するよう製造された特定の構成要素として実装されてよい。本明細書では、「プロセッサ」という用語は、1または複数のデバイス、回路、および/または、コンピュータプログラム命令などのデータを処理するよう構成された処理コアを指すものとする。
以下では、本発明の原理を示す図面を参照しつつ、本発明の1または複数の実施形態の詳細な説明を行う。本発明は、かかる実施形態に関連して説明されているが、どの実施形態にも限定されない。本発明の範囲は、特許請求の範囲によってのみ限定されるものであり、本発明は、多くの代替物、変形物、および、等価物を含む。以下の説明では、本発明の完全な理解を提供するために、多くの具体的な詳細事項が記載されている。これらの詳細事項は、例示を目的としたものであり、本発明は、これらの具体的な詳細事項の一部または全てがなくとも特許請求の範囲に従って実施可能である。簡単のために、本発明に関連する技術分野で周知の技術事項については、本発明が必要以上にわかりにくくならないように、詳細には説明していない。
図1は、コンピュータシステムの一実施形態を示す。システム100は、本明細書では「企業向けスーパーコンピュータ」および「メインフレーム」とも呼ばれる。図の例において、システム100は、近接して位置する(例えば、同じラック内に位置する)複数のノード(例えば、ノード102〜108)を含む。別の実施形態において、(例えば、同じ施設内に位置する)複数のラックのノードが、システムで用いられてもよい。さらに、本明細書に記載の技術は、分散型システムと併せて利用されてもよい。
ノードは、10ギガビットEthernet、ダイレクトPCI−to−PCI、および/または、InfiniBandなど、高速相互接続(110)と相互接続されている。各ノードは、コモディティサーバクラスのハードウェア構成要素(例えば、取り付けられた周辺機器または包含された周辺機器を備えるラック内のブレード)を備える。図1に示す例において、各ノードは、複数の物理プロセッサチップを備える。各物理プロセッサチップ(「ソケット」とも呼ぶ)は、複数のコアを備えており、各コアは、複数のハイパースレッドを有する。
図2に示すように、システム100の物理構造は、(下から)ハイパースレッド(230)、コア(210〜224)、物理プロセッサチップ(202〜208)、および、ノード(102〜108(図から省略され省略記号で表されたノード104、106などを含む))の階層を形成する。図2に示すツリーは、ハードウェア構成によって規定された固定サイズである。
後に詳述するように、各企業向けスーパーコンピュータ(例えば、システム100)は、単一のオペレーティングシステムを実行する。オペレーティングシステムおよび任意のアプリケーションの両方が、標準的な市販のソフトウェアであってよく、システム100上で動作しうる。本明細書に記載の例において、オペレーティングシステムはLinux(登録商標、以下同じ)であるが、Microsoft Windows、Mac OS X、または、FreeBSDなど、その他のオペレーティングシステムが用いられてもよい。
従来の仮想コンピュータ環境では、複数の仮想マシンが、単一の物理マシン上で動作しうる。このシナリオは、図3Aに図示されている。具体的には、3つの仮想マシン(302〜306)が、単一の物理マシン(308)上で3つのゲストオペレーティングシステムを実行しており、物理マシンは、独自のホストオペレーティングシステムを有する。対照的に、本明細書に記載の技術を用いると、複数の物理マシン(354〜358)が、図3Bに示すように、単一の仮想オペレーティングシステム(352)を集合的に実行する。
ソフトウェアスタックの一例が、図4Aに示されている。かかるスタックは、通例、従来のコンピュータ環境で用いられてよい。図4Aに示すスタック内では、アプリケーション(402)が、データベースエンジン(404)上にあり、次いで、データベースエンジン(404)は、オペレーティングシステム(406)上にあり、その下に、ハードウェア(408)がある。図4Bは、いくつかの実施形態において用いられるソフトウェアスタックを示している。図4Aに示したスタックと同様に、アプリケーション(452)が、データベースエンジン(454)上にあり、次いで、データベースエンジン(454)は、オペレーティングシステム(456)上にある。しかしながら、オペレーティングシステムの下かつハードウェアの上には、システムの動作をリアルタイムで観察し、システムの動作時にシステムの要求に一致するようにシステムリソースを最適化するソフトウェアの層(本明細書ではハイパーカーネルと呼ぶ)がある。ハイパーカーネルは、概念的には、一群のコモディティサーバのRAM、プロセッサ、および、I/O(例えば、ストレージ、ネットワーキングリソースのための入力出力リソース)を統合し、その統合したセットをオペレーティングシステムに提示する。この抽象化のため、オペレーティングシステムからは、プロセッサ、メモリ、および、I/Oの集合的なセットを含む単一の大型コンピュータが見える。後に詳述するように、ハイパーカーネルは、リソースの利用を最適化する。ハイパーカーネルは、ネットワークおよびストレージなど、他のI/Oシステムリソースの最適化も助けうる。いくつかの実施形態において、実行中のソフトウェアの観察およびプロファイルに基づいて、パフォーマンス指標(ヒント)が、システムパフォーマンス全体をさらに改善しうるシステムの動的パフォーマンスについて、上層(例えば、データベース管理システム)に提供される。
ハイパーカーネルは、すべての主要なマイクロプロセッサ、メモリ、相互接続、永続記憶装置、および、ネットワーキングアーキテクチャに移植されうる。さらに、ハードウェア技術が(例えば、新たなプロセッサ、新たなメモリ技術、新たな相互接続などで)進化するにつれ、ハイパーカーネルは、産業の進化を活用する必要に応じて修正されうる。
図4Bに示すように、オペレーティングシステム456は、一連のノード(458〜462)にわたって集合的に実行しており、各ノードは、サーバハードウェア上で動作するハイパーカーネルを有する。具体的には、オペレーティングシステムは、一群のハイパーカーネルによって定義された仮想環境上で動作している。後に詳述するように、オペレーティングシステム456の視点では、オペレーティングシステムは、個々のノード458〜462のハードウェアリソースすべてを含む単一のハードウェアプラットフォーム上で動作している。したがって、各ノードが1TBのRAMを備える場合、オペレーティングシステムからは、自身が、3TBのRAMを備えたハードウェアプラットフォーム上で動作しているように見える。その他のリソース(処理能力およびI/Oリソースなど)も、同様に、オペレーティングシステムの視点で集合的に利用可能になりうる。
図5は、一例のシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図である。具体的には、オペレーティングシステム(502)は、プロセッサ504〜508および物理共有メモリ510の上で動作する。上で説明したように、オペレーティングシステムは、従来のコンピュータシステム上または図1に示したような企業のスーパーコンピュータ上のいずれかで動作できる。いずれにしても、オペレーティングシステムから見ると、自身は、プロセッサ504〜508および物理共有メモリ510にアクセスできることになる。
図6Aは、単一のノード上のハードウェアに対するハイパースレッドの視点の一例を示す図である。この例において、ノードは、H1(602)〜H4(608)で示された4つのハイパースレッドを有する。各ハイパースレッドは、物理共有メモリ612のすべての部分にアクセスできる。物理共有メモリ612は、線形メモリであり、位置0から最大量「max」までラベル付けされている。ノードは、3つのレベルのキャッシュ(610)も備える。
図6Bは、一例のシステム上のハードウェアに対するハイパーカーネルの視点の一例を示す図である。この例では、3つのノード(652〜656)が、企業向けスーパーコンピュータに含まれる。3つのノードの各々が、4つのハイパースレッド、物理共有メモリ、および、キャッシュを有する(すなわち、各ノードは、図6Aに示したノード600の一実施形態である)。所与のノード(例えば、ノード652)上のハイパースレッドは、図6Aに示したのと同じ視点を有する。しかしながら、ハイパーカーネルは、すべてのノード上のすべてのリソースを認識している(すなわち、ハイパーカーネルには、12のハイパースレッドおよびすべての物理共有メモリが見える)。図6Bに示した例において、所与のハイパースレッド(例えば、ハイパースレッド658、「H1−4」)は、ノード番号(例えば、「1」)の後にハイパースレッド番号(例えば、「4」)を続けてラベル付けされる。
図7は、一例の企業スーパーコンピュータシステム上のハードウェアに対するオペレーティングシステムの視点の一例を示す図である。オペレーティングシステムには、P1〜Pmax(702)として図7に示された複数の「仮想プロセッサ」が見える。仮想プロセッサは、企業スーパーコンピュータに含まれるすべてのノードにわたるハイパースレッドの総数に対応する。したがって、図6Bの例を用いると、合計12のハイパースレッドが3つのノードにわたって存在する場合、企業向けスーパーコンピュータ上で動作するオペレーティングシステムにとっては、合計12の仮想プロセッサが見えることになる。オペレーティングシステムには、すべてのノードにわたる物理メモリの総量に等しいサイズの大型の物理的な線形メモリのように見える「仮想物理メモリ」(704)も見える。
後に詳述するように、ハイパーカーネルは、実行中のシステムの観察に基づいて、キャッシュメモリの利用および仮想プロセッサの配置を動的に最適化する。「仮想プロセッサ」は、そのゲストオペレーティングシステムに知られている計算エンジン(すなわち、何らかのオペレーティングシステムコンテキストまたは状態を有するもの)である。後に詳述するように、「シャドープロセッサ」は、匿名の仮想プロセッサ(すなわち、仮想プロセッサであったが、現在は、そのオペレーティングシステムコンテキストを放棄しており、ハイパーカーネルにのみ知られるコンテキストを有するもの)である。
リソースの仮想化
メモリの仮想化
上述のように、物理構成において、各ノードは、メモリ内での位置を表す一連のメモリアドレスを有する。このように、(例えば、図6Bに示したように)3つのノードを有する物理構成においては、各々がアドレス0x123456を有する3つのメモリ位置がある。対照的に、仮想構成においては、すべてのメモリアドレスが一意的であり、それらの3つのノードに含まれるすべてのメモリの総計を表す。仮想構成では、すべてのメモリが共有され、すべてのメモリキャッシュがコヒーレントである。いくつかの実施形態において、メモリは、単調増加するメモリアドレスで、一連の連続的なブロックにさらに分割される。本明細書に記載される例において、各ページは、4Kバイトのメモリを有するが、適用できる場合、その他の分割が用いられてもよい。「ブロック」という用語は、本明細書では、メモリ位置の連続的な配列を記述するのに用いられる。いくつかの実施形態において、「ブロック」は「ページ」である。
プロセッサの仮想化
オペレーティングシステムから見られる仮想プロセッサ(例えば、図7の仮想プロセッサ706)は、物理構成内のハイパースレッド上に実装されるが、位置独立でありうる。したがって、オペレーティングシステムは、単一の物理サーバ上で動作する500のプロセッサを有すると考えるが、実際には、各々100プロセッサの5ノードを有しうる。(つまり、図6Bに示したように、オペレーティングシステムは、単一の物理サーバ上で動作する12のプロセッサを有すると考える)。仮想プロセッサ上で実行される計算は、計算が実行されている場合にハイパースレッド上の物理構成によって、または、仮想プロセッサが動作中ではない場合(すなわち、計算の中断またはストールの状態)に「継続(continuation)」で記述される。
本明細書で用いられているように、「継続」は、仮想プロセッサの状態を表す。各継続は:
・プロセッサ状態(すなわち、退避レジスタなど)を有する。
・実行に向けてリーフノードに継続をインテリジェントに割り当てる方法に関する情報でスケジューラオブジェクトを導く1セットのパフォーマンスインジケータを有する。
・オペレーティングシステムの考えるプロセッサがこの継続の割り当てられる物理プロセッサであることを示す仮想プロセッサ識別子を有する。
・この継続が待っている(おそらくは、エンプティである)イベントを有する。
・以下を含む状態を有する:「イベント待機」または「レディ」。
I/Oの仮想化
I/Oシステムは、プロセッサおよびメモリと同様のパラダイムに従う。デバイスは、物理構成における物理アドレスおよび仮想構成における仮想アドレスを有する。(後に詳述する)計算を移動させる時に、例えば、I/O動作に関連するメモリバッファがある場合、利用されるI/Oデバイスは、それらが関連するメモリと同じ場所に配置されれば、より性能が高くなる可能性があり、状況に応じて移動可能である。
リソースマップ
リソースマップは、仮想構成と物理構成との間の翻訳に用いられる。以下は、様々な実施形態において企業向けスーパーコンピュータによって用いられる3つのタイプのリソースマップである。
「物理リソースマップ」は、各ノードで利用可能な物理リソースを記述するテーブルである。それは、例えば、各ノード上のプロセッサ、デバイスの数およびタイプ、利用可能なメモリおよびその物理アドレスの範囲、などを含む。いくつかの実施形態において、このテーブルは、読み出し専用であり、起動時に固定される。
「初期仮想リソースマップ」が、オペレーティングシステムの起動の前に固定され、オペレーティングシステムの観点から利用可能な仮想リソースを記述する。構成は、オペレーティングシステムによって読み取り可能である。一部の例において、下層のハードウェアリソースと、一対一で一致しない(オペレーティングシステムの視点からの)システムを構成することが望ましい場合がある。一例として、オペレーティングシステムにとっては、より多くのメモリおよびより少ないコアを有することが望ましい場合がある。これは、メモリ対コアの比を変更することによって(すなわち、初期仮想リソースマップを修正することによって)達成できる。
「現行のリソースマップ」が、各ハイパーカーネルインスタンスによって作成および維持される。このマップは、各ノードの視点からの仮想リソースマップと物理リソースマップとの間の現行のマッピングを記述する。仮想リソースマップ内の各エントリに対して、仮想リソースへ現在割り当てられている物理リソースの定義が維持される。最初(例えば、起動時に)、現行のリソースマップは、初期仮想リソースマップのコピーである。ハイパーカーネルは、リソース負荷の特性を観察しながら、時間と共に現行のリソースマップを修正し、仮想リソースに対する物理リソースのマッピングを動的に変更する(および逆も行う)。例えば、仮想化マシンにおけるイーサネットコントローラeth27の位置の定義は、異なるハードウェアコントローラを、異なる時間に参照しうる。現行のリソースマップは、必要に応じて、仮想ハードウェアリソースマッピングを動的に修正するためにハイパーカーネル(仮想メモリサブシステムなど)によって用いられる。
リソースマイグレーション(移動)の概要
本明細書に記載の技術を用いれば、仮想リソースを物理位置の間で移動できる。上述のように、オペレーティングシステムは、仮想システムに関する情報を提供されるが、その情報は、物理システムと一致する必要はない。
以下の例において、企業のスーパーコンピュータが、単一のノードに収まりうるよりも大きい大型のインメモリデータベースを保持すると仮定する。データベースの一部は、第1ノード「ノード1」にある。異なるノード「ノード2」上のコアの1つが、ノード1によって所有されノード2上のキャッシュにローカルに存在しないデータにアクセスを試みていると仮定する。ノード2上のコアは、アクセスできると思われる(ただし、アクセスできない)データへのアクセスを試みているので、メモリアクセス違反を受信する。後に詳述するように、例外は、ハイパーカーネルにおいて処理される。
その状況を解決できる一方法は、必要なメモリ領域をノード2に移した後に、制御をオペレーティングシステムに戻す(オペレーティングシステムは、次に、制御をデータベースシステムに戻す)ことによる方法である。次いで、ソフトウェアは、意図されたように進むことができる(すなわち、アクセス違反が起こらなかったかのように)。
多くの場合、上記のノード2が必要とするメモリの同じ領域ブロックにアクセスを試みている他のノード(例えば、「ノード3」)内の1または複数の他のコアが存在しうる。ノード3は、同じデータにアクセスを試みている場合もあるし、移されたメモリに含まれる別のデータにアクセスしている場合もある(「偽共有」とも呼ぶ)。データは、ノード3に移動されることができるが、ノード2上のコアが、二回目にデータを要求した場合、データは、ノード2に戻される必要があり(すなわち、潜在的にデータの往復を繰り返す)、これは、遅くて無駄が多い場合がある。コア間のデータの往復移動を避けるための一方法は、両方のコアと、データに関連するブロックが、同じ場所にあることを認識することである。本明細書に記載の技術を用いれば、メモリおよび計算が、同じノードに存在するように移行されうる。そうすることにより、データへのより高速なアクセスの可能性が高くなり、ローカルキャッシュに格納されたデータを共有する可能性が高くなる。
アクセス違反が起きると、イベントが(システム依存の方法で)トリガされ、それにハイパーカーネルが応答する。かかるイベントに対処する方法の一例は、パニックルーチンの呼び出しによる方法である。適切であれば、その他のアプローチが用いられてもよい。後に詳述するように、ハイパーカーネルは、イベントの原因を分析し、イベントに対処するために適切な戦略(例えば、低レベルトランザクション)を決定する。上述のように、イベントに対処する一方法は、ハイパーカーネル仮想化メモリの1または複数のブロックが、或るノードのメモリから別のノードのメモリへ転送される方法である。次いで、転送が開始され、対応するリソースマップが更新される。継続は、再開された時に行う次のことが、転送の完了後にオペレーティングシステムに制御を戻すことになるように、イベントテーブル(後述する)と呼ばれる共有メモリ内のローカルテーブルに配置される準備が整うように構築される。要求されているメモリを含むノードに仮想プロセッサを移動させる決定、または、或るノードから別のノードへ仮想メモリ(およびその仮想メモリアドレス)を移動させる決定もなされうる。様々な実施形態において、ハイパーカーネルは、イベントに対処する時に以下の3つの決定を行う:どの(仮想)リソースが移動すべきか、いつ移動させるべきか、および、(物理位置に関して)どこへ移動すべきか。
タイダルツリー(TIDALTREE)
図2に示した物理階層構造は、1セットの「スケジューラオブジェクト」(すなわち、データ構造)を含む類似のソフトウェア階層を有し、各スケジューラオブジェクトは、後述の1セットの特徴を有する。スケジューラオブジェクトは、「タイダルツリー」を形成し、これは、ツリーの各ノードがスケジューラオブジェクトであるインメモリツリーデータ構造である。各スケジューラオブジェクトは、スーパーコンピュータの物理構造の要素に対応する(ただし、必ずしも逆は成り立たない)ので、マシン全体に対して1つのノード(例えば、図2に示したノード100)、システムの各物理ノードに対して1つのノード(図2に示したノード102)、マシン全体を含む物理ノード上の各マルチコアソケットに対して1つのノード(例えば、図2に示したノード202)、各ソケットの各コアに対して1つのノード(例えば、図2に示したノード210)、そのコア上の各ハイパースレッドに対して1つのノード(例えば、図2に示したノード232)が存在する。
各スケジューラオブジェクトsは、
・物理的構成要素(例えば、ラック、ブレード、ソケット、コア、ハイパースレッド)に関連する。
・ツリーのルートを除いて、(後に詳述するように)その動作を方向付けることに部分的に関与する親スケジューラオブジェクトを有する。
・各々がスケジューラオブジェクトである1セットの子オブジェクトを有する。これは、リーフ(例えば、ハイパースレッド)ノードについては空のセットである。後に詳述するように、作業を管理して、その子オブジェクトに、そして、間接的に孫オブジェクトなどに、作業を割り当てる(または、割り当て直す)のが、スケジューラオブジェクトsの役割である(すなわち、sは、sをルートとするサブツリー内のすべてのノードを管理する)。
・(上述のように)1セットの継続である作業キューを有する。
・作業を管理して割り当てる(または割り当て直す)ことに同じく関与する(おそらくは空の)セットのI/Oデバイスを有する。
各ノードは、何らかのキャッシュメモリの形態の層と潜在的に関連付けられうる。キャッシュ階層は、スケジューラオブジェクトが高くなるほど、通常は、計算が階層の対応するレベルのキャッシュを効率的に利用することが遅くなるという意味では、ツリーの階層に従う。物理ノードに対応するスケジューラオブジェクトのキャッシュは、そのノードに対応するメモリのキャッシュでありうる。物理ノード上のメモリは、仮想マシンのメモリのキャッシュと考えることができる。
リソースマイグレーション−追加情報
ハイパーカーネルは、仮想構成が存在する仮想ハードウェアの一部をシミュレートする。それは、イベント駆動型アーキテクチャであり、翻訳された物理ハードウェアイベントだけでなく、他のノード上で動作するハイパーカーネルコードによって生成されたノード間ハイパーカーネルメッセージの受信など、ソフトイベントも処理する。
上述のように、ハイパーカーネルにとって重要な割り込みイベントが発生すると、ハイパーカーネルは、割り込みに応答する方法を決定する。制御がオペレーティングシステムに戻される前に、任意のより高い優先順位の割り込みが認識され、適切な動作が取られる。また、上述のように、ハイパーカーネルは、3つの別個の決定を行いうる。(1)特定のイベント後にどのリソースが移動すべきか、(2)いつそれらを移動させるか、および、(3)それらのリソースはどこに移動すべきか。
以下の例において、仮想マシン内のスケジューラオブジェクト「s」が、定常状態であると仮定する。物理ノードに対応する各スケジューラオブジェクトは、それに割り当てられた1セットの物理プロセッサソケットを有する。これらのソケット内のハイパースレッドは、ビジーであってもそうでなくてもよい。物理ノードは、さらに、いくらかの固定量のメインメモリと、いくつかのネットワークデバイスなど、1セットのI/Oデバイスと、を有する。スケジューラオブジェクトsは、ノードに対応する場合、ネットワークと、sをルートとするサブツリー内のノードに割り当てられた他のI/Oデバイスとの管理にも関与する。以下では、リソースが同期または非同期的イベントのいずれかの後にどのように移動しうるのかを説明する。
同期イベントによってトリガされるマイグレーション
以下の例では、リーフノードスケジューラオブジェクトsと、sに割り当てられた仮想プロセッサpが存在すると仮定する。リーフノードスケジューラオブジェクトsは、アプリケーションの代わりに、アプリケーションまたはオペレーティングシステムコードを実行しているとする。リーフノードが無限ループに入っていないと仮定すると、pは、最終的に、何らかの理由(例えば、I/O動作、ページフォールトなどの完了の待機)で、実行すべき作業がなくなる(すなわち、ストールする)。pが実際にストールすることを許容する代わりに、ハイパーカーネルは、ストールされた計算に関する情報を或る他のノードに移して、他のノードのプロセッサの1つに、ストールした継続の「責任」を持たせるのか、または、ストールした計算に対するノードの「責任」を維持し、その代わりに現行のノードに関連リソースを移すのかを決定する。
したがって、ストールは、以下の2つの方法のいずれかで処理される:計算が、現在リソースを有する物理ノードに移されるか、あるいは、リソースが、リソースを要求した物理ノードに移される。ストールの処理のための擬似コードの例は、後の「ルーチンの例」セクションで(「OnStall」ルーチンとして)提供される。
ストールを処理する方法などの決定は、イベントの到着順、仮想マシン上で実行中の計算の状態、キャッシュの状態、システムまたはノードへの負荷、ならびに、多くのその他のことなど、多くのことに依存しうる。決定は、動的になされる、すなわち、時間の所与の時点に利用可能な最良の情報に基づいてなされる。
ストールした計算の記録
ストールした計算は、「継続」と呼ばれるデータ構造に記録される。継続は、例えば、「イベント待機」または「レディ」でありうる状態を有する。ストールした計算は、状態「イベント待機」を持つ新たに作成された継続として記録される。(例えば、イベントの検出により)ストールの理由が満たされると、対応する継続の状態は、「レディ」に変更される。「レディ」状態を持つ各継続は、最終的に実行に向けてスケジュールされるように、スケジューラオブジェクトの「待機キュー」に格納される。対照的に、「イベント待機」状態を持つ任意の継続は、どのスケジューラオブジェクトの待機キューにも格納されない。その代わり、見つからないリソースの受信など、対応する計算をストールさせたハードウェアイベントの発生が予測される物理ノードのローカル共有メモリに格納される。
さらに、新たに作成された継続は、その作成の原因となったストールイベントに関連付けられる。(ストール)イベントと、これらのイベントを待つ継続との間のこのマッピングは、非同期イベントの迅速なディスパッチを可能にする(後述の「handleEvent」を参照)。継続とイベントとの間のマッピングは、「イベントテーブル」と呼ばれるテーブルに格納され、対応する物理ノードの共有メモリ内に保持される。各物理ノードは、独自のイベントテーブルを有し、物理ノードのイベントテーブルは、物理ノード上のすべてのコアによって直接的にアドレス可能である。物理ノードのイベントテーブルに記録されたすべての予期されたイベントは、物理ノード上で発生しうるハードウェアイベントに対応する。物理ノードnにマッピングされたスケジューラオブジェクトsは、nを表し、nのイベントテーブルは、sと関連付けられる。一部の例において、いくつかの継続が、同じイベントを待っている場合があり、イベントがトリガされた時に、何らかの曖昧性の除去が求められうる。
継続は、「InitContinuation」ルーチンを用いて構築される。計算を移動させる決定がなされた場合、リソースを保持するリモート物理ノードが、ストールされた計算に対応する継続を構築し、リモート物理ノードのイベントテーブルにそれを格納する。その継続が再開すると、リソースは利用可能になる。実際には、ハイパーカーネルは、異なるノードに仮想プロセッサを移している。
リソースを移動させる決定がなされた場合、ストールを経験したノードは、リソースの移送を要求し、InitContinuationを用いて継続を構築し、ローカルイベントテーブルにそれを格納する。リソースの受信後、継続は、タイダルツリー内の適切なノードにアタッチされ、その継続が再開されると、リソースは、一般に、利用可能かつ可視になる。実際には、仮想リソースは、それを要求したノードに移送されている。
イベントテーブル内に継続を配置することにより、イベントを受信するプロセッサが、ローカルイベントテーブル内で関連する継続を迅速に見つけることが保証されることに注意されたい。計算のストールの理由は、満たされることになる。
ストールに対処すると、仮想プロセッサpは、実際には一時停止される。ストールを処理して、再開すべき新たな継続を見つけるまでの合間に、pは、「匿名のシャドープロセッサ」になる、すなわち、オペレーティングシステムに知られているIDのないプロセッサになる。次いで、このシャドープロセッサは、再開すべき新たな継続を探す。これの一例が、後に詳述する「assignProcessor」ルーチンに見られる。
表記
仮想プロセッサpをストールしたイベントをeとする。eは、或る物理ノードnのローカルハードウェアによってトリガされると仮定する。特に、rが、ストールイベントの発生の原因となったリソースであると仮定する。リソースrは、メモリのブロック、I/O動作、または、ネットワーク動作でありうる。pは、スケジューラオブジェクトsに割り当てられると仮定し、スケジューラオブジェクトsは、物理ノードnを表すスケジューラオブジェクトをルートとするサブツリーに属する。
On−Stall
on−stallルーチンの一例に対する擬似コードを、以下の「ルーチンの例」セクションで提供する。migration−continuation関数は、リソースが移動すべきではない、すなわち、計算が移動すべきであると、ノードn内のプロセッサpが決定した場合かつその場合に限り、trueを返す。これは、ノード間でのrの移動の履歴および頻度、rのタイプ、移動のコスト、rを待つnのローカルイベントテーブル内のイベントの数、システム負荷など、多くの要因によって決定されうる。例えば、リソースを待つnのローカルイベントテーブルに格納された継続がある場合、そのリソースを移動することが望ましくない場合がある。
マイグレーションの恩恵を受ける様々なパターンのイベントが存在する。アクセス違反のようなこれらのパターンのイベントを記述する1つのアプローチは、形式言語理論である。正規(すなわち、チョムスキーのタイプ3)言語は、有限状態オートマトンによって認識することができる。さらに、コンパクトで柔軟な表記を用いて、観察されるイベントの記述は、正規言語の文(またはチョムスキー配列(Chomsky sequence))としてなされることができ、認識は、対応する有限状態オートマトンにおける状態遷移としてモデル化されうる。イベントの完全なチョムスキー配列が見られる場合、migration−continuationは、それに応じて評価される:有限状態オートマトンがチョムスキー配列を受け入れる場合、条件は満たされ、そうでない場合には満たされない。最小化された有限状態マシンの長さは、保持する必要のある履歴の量を規定する。
様々な実施形態において、すべてのイベントがローカルに起こり、イベントを受信する物理ノード上のハイパーカーネルが、それを処理しなければならない−真の同期イベントは、物理ノード間で発生しないと仮定される。ノード間でのマイグレーション戦略を調整するために、「メッセージ」が用いられる。プロセッサまたはシャドープロセッサが、一般に、メッセージの受信を待たない点で、メッセージ「送信」は、ノードの視点からは同期的であるが、メッセージ「受信」は、非同期的である。メッセージが到着すると、仮想割り込みとしてハイパーカーネルによって処理される。一実施形態において、ハイパーカーネルは、処理を待つメッセージがある間は、プロセッサが継続を再開することを許容しない。したがって、制御がオペレーティングシステムに戻される前に、キューがチェックされ、オペレーティングシステムに制御を戻す前に、あらゆるメッセージが処理される。
スケジューラオブジェクトsおよび継続cについて、ツリーの検索を導くために、コスト関数cost(s,c)を利用できる。pの複数の先祖が空ではないキューを有する場合に、pは、空ではない待機キューで見つかった第1先祖でその検索の停止を望まない場合がある。最適化戦略で用いられるメトリクスに応じて、pの選択は、pとその選択された先祖との間の距離にだけでなく、その他のパラメータ(待機キューの長さなど)にも依存してよい。
スケジューラオブジェクトの(空でない)待機キューにおける「最良適合」継続を返すために、関数find−best−within(s)を利用できる。考慮できるパラメータの例は以下を含む。
1.キューにおける位置
2.pと、継続に記録された最後の位置との間の関係性(それらの位置が近いほど、キャッシュエントリの再利用にとって良くなる)
3.キューに内の継続に記録されたパフォーマンスインジケータ
cost関数およびfind−best−within関数は、所与のシステム内で適用可能なようにカスタマイズできる。
非同期イベントによってトリガされるマイグレーション
非同期イベントの例は以下を含む。パケットの受信、I/O転送の完了、リソースの受信、リソースを要求するメッセージの受信、など。一般に、オペレーティングシステムによって管理されるハードウェアデバイスに対応するイベントを受信するハイパーカーネルは、そのイベントに関連する継続をスケジューラオブジェクトsに供給する必要がある。そうすることにより、sは、適切なスケジューラオブジェクトに、そして最終的には、その継続によって表されたオペレーティングシステムによって管理される計算に、この継続を利用可能にする。他方で、イベントが、別の物理ノード上のハイパーカーネルからのメッセージの受信である場合、ハイパーカーネルは、それを直接処理できる。
説明を簡単にするために、本明細書に記載の例においては、イベントに関連する継続が1つだけであると仮定する。本明細書に記載の手順は、必要に応じて、複数の継続が同じイベントに関連する例に一般化できる。
いくつかの実施形態において、継続を配置すべきスケジューラオブジェクトの検索は、その継続を構築したツリーのリーフで始まり、その後、(計算がこのノードで以前に実行された場合には)上方に進む。そうすることにより、キャッシュエントリの再利用の可能性が高くなる。
Handle−Event
handle−eventルーチンの一例に対する擬似コードを、以下の「ルーチンの例」セクションで提供する。コスト関数cost(s,c)は、スケジューリングオブジェクトsにcを割り当てる適合性を決定するのに役立つ関数である。コスト関数は、待機キューのサイズ、(キャッシュエントリが再利用される可能性を高めるための)sとcの元々のスケジューリングノードとの間のノードトラバース距離、ならびに、仮想プロセッサ、物理プロセッサ、および、継続の履歴など、様々なパラメータに依存しうる。sに近いスケジューラオブジェクトの待機キューの含む継続がすでに多すぎる場合、すべての新たに追加された継続が実行に向けてスケジュールされるまでに比較的長い時間が掛かりうる。cost(s,c)に寄与する条件の例を以下に記載しており、それらの状態は、適用可能なようにカスタマイズできる。
コスト
コスト関数は、継続を選択してオブジェクトをスケジューリングする時にオプションを評価するために用いられる。コスト関数は、重み付き因子の総和として表現できる。
cost=w1f1 x 1+w2f2 x 2+・・・+wnfn x n
ここで、wiは、対応する因子の重要度を示し、xiは、指数を示す。
因子fiの例を、以下のコストの各々について記載する。重みwiおよび指数xiは、様々な方法で決定できる(経験的に決定する、シミュレーションによって決定する、など)。初期の重みおよび指数は、様々な応用のニーズに合わせることが可能であり、パフォーマンスを改善するために、管理者によって調整されうる。重みは、システムがアクティブである間に調整可能であり、重みの変更は、ハイパーカーネルのセマンティクスを変更せず、動作パフォーマンス特徴だけを変更する。
考慮できる因子の例は以下を含む。
・最後のプロセッサがこのスケジューラオブジェクトを評価してからの時間の長さ
・タイダルツリー内でのスケジューラオブジェクトの高さ
・作業キューの長さ
・保留ステータス(すなわち、或るアプリケーションが特定の理由でこのリソースを保存した場合でありうる)
・ノード仕様(すなわち、ノード自体が、非稼働状態にされた可能性がある、または、問題がある、何らかの形で特殊な機能を有する、など)
・キュー内の継続の齢
・この継続を最も実行しそうにない物理プロセッサ
・この継続を最も実行しそうにない仮想プロセッサ
・この継続を最後に実行していたノード
・キャッシュの「温度」(キャッシュは、再利用される可能性のあるエントリを有する場合に「温かい」。キャッシュは、再利用可能なキャッシュエントリを有する可能性が低い場合に「冷たい」)
・継続のグループメンバーシップ(すなわち、継続は、計算グループの一部であってよく、グループの各要素は、グループのその他のメンバに対する何らかの親和性を有する)
・パフォーマンスインジケータ(ヒント)および特別な要件
例
「OnStall」および「assignProcessor」
図8は、リソースを選択的に移動させるための処理の一実施形態を示す。いくつかの実施形態において、処理800は、OnStallルーチンと共に実行されるなど、ハイパーカーネルによって実行される。処理は、コア(または、プロセッサチップがハイパースレッドを支持するか否かに応じて、コアに含まれるハイパーカーネル)がブロックされている旨の示唆が受信される工程802で始まる。一例として、ハイパースレッドがアクセスできないリソース(例えば、ハイパースレッドを保持するノードとは異なるノードに配置されたRAM)の要求を、そのハイパースレッドが直接的または間接的に受信すると仮定する。ハイパースレッドがリソースにアクセスできない(すなわち、アクセス違反が発生する)場合、割り込みが起こり、それは、工程802においてハイパーカーネルによって、インターセプト、キャッチ、または、その他の方法で受信される。特に、ハイパーカーネルは、(提供するよう指示されたリソースへアクセスできないので)ハイパースレッドがブロックされている旨の示唆を工程802で受信する。ブロック状態を報告することに加えて、ハイパーカーネルは、アクセスするよう指示されたメモリアドレスおよび試みられたアクセスのタイプ(例えば、読み出し、書き込み、または、修正)などの情報を提供する。
工程804では、ハイパーカーネルは、必要とされるメモリが(例えば、ブロックされたハイパースレッドが位置するノードへ)移動されるべきか、要求処理が再マッピングされる(すなわち、仮想プロセッサが別のノードに移される)べきかを決定する。決定は、必要とされるメモリが位置する場所、キャッシュの温度、ハイパースレッドを保持するノードへの作業負荷、および、必要とされるメモリを保持するノードへの作業負荷(例えば、過負荷または低負荷)など、様々な因子に基づきうる。いくつかの実施形態において、ノードの作業負荷は、タイダルツリーにおける平均キュー長に少なくとも部分的に基づいて決定される。
ハイパーカーネルは、メモリが移動されるべきであると決定した場合、その現行のリソースマップを用いて、どのノードが必要とされるメモリを保持する可能性があるかを判定し、そのノードへメッセージを送信して、リソースを要求する。ハイパーカーネルは、さらに、継続を作成し、そのイベントテーブルにその継続を配置する。したがって、工程802においてブロックされたハイパースレッドは、他の作業を引き受けるために解放され、assignProcessorルーチンを用いて別の仮想プロセッサに割り当てられうる。
ハイパーカーネルは、優先度の高さに基づいて、そのメッセージキューをチェックする。ハイパーカーネルが、自身の接触したノード(すなわち、「第1接触ノード」)からメッセージを受信すると、いくつかの実施形態において、2つの応答の内の1つが受信される。応答は、第1接触ノードが、必要とされるリソースを有することを示唆してよい(そして、リソースを提供してよい)あるいは、メッセージは、接触ノードが(例えば、そのノードがリソースを別のノードに提供したために)リソースをもはや持たないことを示唆してもよい。後者の状況において、第1接触ノードは、それがリソースを送信する送信先のノード(すなわち、「第2ノード」)のIDを提供し、ハイパーカーネルは、リソースを要求する第2メッセージを、この例では第2ノードに送信できる。様々な実施形態において、第2ノードが、自身もリソースを持たないこと(例えば、第3ノードに提供したこと)をハイパーカーネルに報告した場合、ハイパーカーネルは、リソースを要求し続けるのではなく、第3ノードに継続を送信することを選んでよい。継続を送信するか、リソースを継続するかを決定する際に、他の閾値を用いてもよい(例えば、4回の試行)。さらに、リソースを要求するか、継続を送信するかを決定する際に、様々な基準を用いてよい(例えば、コスト関数に従う)。
ハイパーカーネルは、継続が転送されるべきである(すなわち、ローカルにリソースを受信するのではなく、計算が別のノードに送信されるべきである)と決定した場合、リモートノード(すなわち、必要とされるリソースを持つノード)に、リモートノードがそれ自身の物理アドレス空間内に継続を構築するために利用できる情報を提供する。リモートノード(すなわち、継続を受信するノード)が、自身の必要とするリソースすべてを有する(すなわち、最初のアクセス違反を引き起こしたリソースを保有する)場合、継続は、リモートノードのイベントテーブルに配置される必要はなく、その代わりにタイダルツリーに配置されてよい。リモートノードが、継続を処理するためにさらなるリソースを必要とする場合、受信された継続は、リモートノードのイベントテーブル内に配置される。
図9は、階層的な動的スケジューリングを実行するための処理の一実施形態を示す。いくつかの実施形態において、処理900は、assignProcessorルーチンと共に実行されるなど、ハイパーカーネルによって実行される。処理は、ハイパースレッドが割り当てられるべきである旨の示唆が受信される工程902から始まる。処理900は、複数の方法で呼び出されうる。一例として、処理900は、ハイパースレッドが利用可能である(すなわち、実行すべき現在の作業を持たない)時に呼び出されうる。これは、例えば、継続がなされるべきであるとハイパーカーネルが(例えば、工程804において)決定した時に、起こりうる。以前にブロックされたハイパースレッドは、ブロックの対象となった計算を処理する責任がもはやない(すなわち、ハイパースレッドが「匿名のシャドープロセッサ」になる)ので、利用可能になる。第2の例として、処理900は、以前には利用不可能であったリソースが現在は利用可能である旨のメッセージが(例えば、ハイパーカーネルによって)受信された時に呼び出されうる。ハイパーカーネルは、リソースを必要としていた計算を再開するために、ハイパースレッドをロケートする必要がある。もともとリソースの不足によってブロックされていたハイパースレッドが、リソースの受信後に計算を再開するハイパースレッドである必要はないことに注意されたい。
工程904では、タイダルツリーにおいて、実行の準備が整っている継続が検索され、ハイパースレッドが再開すべきものとして、1つの継続が選択される。様々な実施形態において、タイダルツリーは、リーフレベルから上向きに検索され、コスト関数が、ハイパースレッドにどの継続を割り当てるのかを決定するために用いられる。一例として、ハイパースレッドが利用可能になった時に、最も長い時間にわたってキューに入れられていた継続が、割り当てられうる。リーフレベルに待機中の継続がない場合、または、コスト関数によって指定された閾値外にある場合、ハイパースレッドに割り当てるべき適切な継続が、タイダルツリーで検索される(例えば、コアレベル、次に、ソケットレベル、次に、ノードレベルで)。ハイパースレッドがノードレベルで再開するのに適切な継続が見つからなかった場合、そのノードのハイパーカーネルは、ルートに接触する。ノードレベルで継続が見つからない1つの典型的な理由は、そのノードが完全に利用されるのに十分な作業がないことである。いくつかの実施形態において、ノードまたはノードの一部は、エネルギ節約状態に入りうる。
時系列
説明のために、例においては、「スワップ」動作が、継続およびメモリの移動に用いられるが、実際には、これは、すべての実施形態で必要なことでない。
図10は、初期のメモリ割り当ておよびプロセッサ割り当ての一例を示す。具体的には、図10の領域1002は、メモリの物理ブロック(左側)と、メモリの現在のオーナ(中央列)との間のハイパーカーネルのマッピングを示す。右の列は、メモリの以前のオーナを示す。これは初期のメモリ割り当てであるため、現在および直前のオーナ列は、同じ値を保持する。図10の領域1004は、システム仮想プロセッサ(左側)と、物理ノード(中央列)/コア番号(右列)との間のハイパーカーネルのマッピングを示す。
仮想プロセッサP00が位置8FFFFを読み出すためにメモリ要求し、ハイパーカーネルがP00と同じノード(すなわち、ノード0)へ8FFFFを含む1または複数のメモリブロックを移動することを決定すると仮定する。ブロック8FFFFは、ノード2に位置する。したがって、図11に示すように、8FFFFを含むブロックは、ノード0に移され、別のブロックが、(排除が必要であり、ブロックが有効である場合には)スワップアウトされる。
次に、仮想プロセッサP06が位置81FFFを読み出すためにメモリ要求をすると仮定する。このブロックのコンテンツは、ノード0に(図11に示すように)移動されている。ハイパーカーネルは、メモリを再び移動させるのではなく、計算が移動されるべきであると決定してよい。したがって、図12に示すように、仮想プロセッサP06は、ノード0に移動され、仮想プロセッサP01とスワップされてよい。
パフォーマンス情報
ロックおよびその他の同期装置
様々な実施形態において、ロックのような同期メカニズムの利用が最小限である。例えば、ロックは、スケジューラオブジェクト上でキューの挿入およびキュー継続の除去を行うため、および、イベントテーブルを維持するために用いられる。
コードパス長
いくつかの実施形態において、すべてのコードパスの(最大)長は、静的コード解析を通して決定され、その結果、ハイパーカーネル自体で費やされる評価可能な有界の時間が得られる。すべてのデータ構造が、例えば、インデックス付きの配列として、事前に割り当てられうる。タイダルツリーのノードは、起動時に決定され、それらのトラバースの際のステップ数と同様に、不変である。1つの可変長計算が、作業キューの長さと関連があるが、それすら有界でありえ、最悪ケース推定値が計算されうる。別の実施形態では、その他の可変長計算が用いられる。
スタティックストレージ
様々な実施形態において、ハイパーカーネルで必要とされるすべてのデータ構造が静的であり、起動時に決定されるので、動的メモリ割り当てまたはガベージコレクションの必要性はない。
物理メモリ
ハイパーカーネルによって用いられるすべてのメモリが物理メモリであるので、内部動作に必要なページテーブルも仮想メモリもなく(例えば、それが管理している仮想リソースの管理を除く)、さらに、ハイパーカーネルがオペレーティングシステムと共存するのを助ける。
データの共有と整合性の維持
一部の例において、例えば、オペレーティングシステムに提示される仮想マシンの概念的統合性を保つために、或るノードのデータ構造の変化が、別のノードの対応する変化と協調される。本明細書に記載のデータ構造の多くは、「ノードローカル」であり、移動する必要がないか、または、不変であり複製される。ノードローカルであるデータ構造は、ノード上のすべてのハイパースレッドに可視であり、それらによってアドレス可能である。ノードローカルではない(したがって、協調を必要とする)データ構造の例は、現在のリソースマップ(またはその一部)と、タイダルツリーのルートと、移動する継続(すなわち、或るノードから別のノードへ論理的に移動する必要がありうる継続)と、を含む。
様々な技術が、十分な程度の整合性を維持するために用いられてよい。一部の技術は同期的であり、すべての変化がすべてのノードにとって同時に可視的になること(すなわち、「即時整合性」)を仮定する。他の技術は、より緩和されたソリューションを可能にし、「結果整合性」を追求する。上述のように、企業のスーパーコンピュータの物理ノードは、1または複数の高速相互接続を介して接続されている。ハイパーカーネルの複数のインスタンスが、物理ノード間でメッセージおよびリソースをやり取りするために相互接続される。
現行のリソースマップの更新
各物理ノードnは、物理リソースマップの同じコピー、初期の仮想リソースマップ、および、現行のリソースマップから(例えば、起動時に)開始する。各ノードは、現行のリソースマップの独自のコピーを維持する。
いくつかの実施形態において、現行のリソースマップ内のリソースrの各エントリは、以下を有する。
1.ローカルロック。その結果、物理ノード上の複数のハイパースレッドが同時にrを修正できなくなる
2.現在リソースを所有するノードを特定するノード番号
3.最後にrを所有していた時から要求された回数nのカウントk
4.設定された場合に、このノードnがrを求めることを示すブーリアン
5.設定された場合に、このノードがrを有するが移送の途中であることを示すブールであり、この場合、ノード番号が新しいオーナを特定する
いくつかの実施形態において、カウントkは、限りないリソースの追求に対処するために用いられる。kが閾値を超えた場合、システム周囲のリソースを追求するのではなく、新たに構築された継続を移動させる方がよいという決定がなされる。
以下は、リソースのマイグレーションを開始してリソースを受信するためのメカニズムの一例である。重要なトランザクションは以下を含む。
1.ノードnが、リソースrの要求をn’に送信する。
2.ノードn’は、リソースrの要求をnから受信する。
3.ノードn’は、特定の状況下でnに「拒否」メッセージを送信してよく、そうでなければ、「受け入れ」ることができ、リソースrを送信する。
4.ノードnは、リソースrがこの時点でn’によって送信不能である場合、n’から「拒否」メッセージを受信する。rがn’によって必要とされているか、または、要求の到着時にrがどこか他の場所に移送されている場合がありうる。要求が拒否された場合、n’は、リソースを移送する先のノードの「移送先」アドレスを送信できる。移送先アドレスがn’自体である場合があり、これは、「後に再試行する」ことと等価である。ノードnは、拒否メッセージを受信すると、n’によって示唆されたノード(しばしば、リソースの新しいオーナ)へ要求を再送信できる。nがシステム周囲のリソースを追求することを避けるために、nは、リソースを得るための試行の回数を記録することができ、試行の回数が閾値を超えると戦略を切り替える。
5.ノードnは、n’がリソースを送信できる場合、リソースrを受信する。この場合、nは、cが再開されうるように、rを待っていた継続cをスケジューリングする必要がある。
タイダルツリーのルート
いくつかの実施形態において、システム内のノードセットの内の1つの物理ノードが、「マスタノード」に指定される。このノードは、起動時に、初期仮想リソースマップおよびその他のデータ構造を構築し、他のノードにそれらを複製し、オペレーティングシステム(例えば、Linux)を起動する責任を有する。マスタノードは、1つの例外を除いて、システムが起動された後には任意の他のノードと同様でありうる。少なくとも1つの物理ノードが、タイダルツリーのルートを格納する必要がある。マスタノードは、ルートが配置されうる場所の一例である。タイダルツリールートスケジューリングオブジェクトのイベントキューの更新が、更新を実行するためにマスタノードへメッセージを送信することによって、各ノードにおいて処理される。
時間と共に、オペレーティングシステムおよびアプリケーションのリソースアクセスパターンが許す場合には、ハイパーカーネルが適合され、ローカル性が連続的に改善する。
継続
上述のように、全ノードにわたる物理メモリアドレスは一意的ではない。いくつかの実施形態において、継続内に物理メモリアドレスを含めることは、パーティション整数インデックスを用いてハイパーカーネル内の重要なデータ構造を指定することによって避けることができる。アドレスが継続内に入れられる必要がある場合、そのアドレスは、ソースの物理アドレスであり、宛先における物理アドレスとの関係性がないので、移動に注意が払われる。継続の移動は、上述のように宛先ノードにそのコンテンツをコピーして、ソースからターゲットへ任意の物理アドレスを再マッピングすることを意味する。
タイムスタンプ
いくつかの実施形態では、フリーランニングカウンタへのアクセスが、すべてのノードに可視である。これがない場合、各ノード上のフリーランニングカウンタも利用できる。継続内のカウンタが、ソースと宛先との間でマッピングされる。
ディスクおよび永続性フラッシュの取り扱い
必要とされるリソースがディスク(または永続性フラッシュ)上にある場合、いくつかの実施形態において、かかるリソースは、RAMなどのリソースよりも重い重力場を有するものとして扱われる。したがって、ディスク/フラッシュリソースは、あまり頻繁には移行しない傾向にある。その代わり、継続が、需要に基づいて、必要とされる永続性ストレージを含む物理ノードへ、または、永続性ストレージに関連するバッファへ、より頻繁に移行する。
オペレーティングシステム構成
オペレーティングシステムを構成する多くの方法がある。サーバについて、そのオペレーティングシステムが、ハイパーカーネルによって実装された仮想マシンから小さいセットのリソースタイプ:線形ブロック配列、ネットワーク、プロセッサ、メモリ、および、ノード間相互接続を含むストレージ、のみを必要とするよう構成されていると仮定できる。結果として、オペレーティングシステムのインストールの複雑さを軽減できる。
データ構造および関数の例
以下のセクションは、様々な実施形態で用いられるデータ構造および関数の例のリストを提供する。
init−continuation:計算がストールした時に、継続を開始する。
assignProcessor:(可能であれば)シャドープロセッサに新たな継続を割り当てるルーチン。
on−stall(r):リソースrについてストールイベントが起きる。
migrate−computation(computational−state,r,n):リソースrを有すると期待する別のノードnへの計算状態の移動を要求するためのメッセージ。
on−interrupt(i):ソフトウェア割り込みiが起きる。
handle−event(e):ハイパーカーネルが非同期的イベントを処理するよう要求された時に実行されるルーチン。
request−resource(r,n):ノードnからのリソースrの移送を要求する。
initiate−send−resource(r,n):ノードnへのリソースrの送信を開始する。
on−request−transfer−response(r,n,b):nからのrの移送要求が受け入れられたか拒否されたか。拒否された場合、bはtrueである。
on−transfer−requested(r,m):mからのリソースrに対する要求を受信する。
on−resource−transferred(r,n):リソースrの肯定応答がnから受信された。
on−receive−resource(r,n):リソースrがnから受信された。
migration−continuation(r):リソースの移動よりも継続の移動の方が良い場合かつその場合に限り、trueになる。
parent(s):スケジューラオブジェクトsの親スケジューラオブジェクトを返す。
cost(s,c):スケジューラオブジェクトsの待機キュー内の継続cの配置を評価するために用いられる。
find−best−within(s):スケジューラオブジェクトsの待機キューに格納された継続を返すコスト関数。
conserve−energy:低電力モードに入る。
resume−continuation(c):その時点でこの関数を実行しているプロセッサ内のcによって表された計算を再開する。
valid(i):割り込みiがまだ有効である場合かつその場合に限り、trueを戻すブール関数。
initialize(best−guess):コスト変数の最良推定を開始する。
insert−queue(s,c):スケジューラオブジェクトsの待機キューに継続cを挿入する。
return−from−virtual−interrupt:割り込みにより一時的に停止された実行を再開する。
r.owner:リソースrがローカルであるノードを返す。
r.e:リソースrがこのイベントを待っている。
e.r:このイベントはリソースrのためのものである。
e.continuation:このイベントが起きると、継続を再開する必要がある。
get−state():プロセッサの状態を返す。
scheduler−object(p):プロセッサpと現在関連しているスケジューラオブジェクトを返す。
on−request−transfer−response(r,m,response):リソースrをノードmから移送する要求への応答。応答は、「拒否される」場合のtrue、または、「受け入れられる」場合のfalseのいずれかでありうる。
ルーチンの例
以下は、様々な実施形態で用いられるルーチンの擬似コードの例である。以下では、「on−」で始まる関数は、非同期的イベントまたは入ってくるメッセージである。
==========================
init−continuation(computational−state)
==========================
/*ヒントhを持つリソースrを待っているプロセッサpによるInitContinuation*/
c=allocate continuation
c.state=computational−state
c.last=scheduler−object(p)
c.state=waiting−for−event
c.hints=h
e=allocate event in event−table
e.resource=r
e.continuation=c
return c
end InitContinuation
==========================
assignProcessor
==========================
/*物理ノードnにおけるプロセッサpがシャドープロセッサになると、そのO/Sのアイデンティティを放棄し、実行を再開するための継続を探し始める。pは、以下のように待機キューでかかる継続を探す:*/
s=scheduler−object(p)
initialize(best−guess)
best−s=nil
/*上方へトラバースして、最良の候補を追跡する*/
/*ルートのローカルにキャッシュされたコピーがあると仮定する*/
repeat
guess=cost(s)
if guess>best−guess
then
best−guess=guess
best−s=s
s=parent(s)
until s=nil
if best−s<>nil
then
c=find−best−within(best−s)
resume−continuation(c)
else conserve−energy
end assignProcessor
==========================
on−stall(r)
==========================
/*OnStallは、ハードウェアが仮想構成と物理構成との間の不一致を検出した時に呼び出される。より具体的には、ハードウェアがノードn上で見つけることができないリソースrを、ノードnが要求する。*/
if migration−continuation(r)
then
/*ノードnに計算を送信する*/
nn=owner(r)
/*ノードnは、リソースがおそらくノードnnにあると考える*/
migrate−computation(r,nn)
else
/*リソースrを要求する*/
c=init−continuation(get−state())
/*ローカルイベントテーブルにcを挿入するためのコードをここに挿入する*/
request−resource(r,owner(r))
assignProcessor /*この時点で、pは匿名のシャドープロセッサである*/
/*pは、実行すべき何らかの作業を見つける必要がある*/
end OnStall
==========================
on−migrate−computation(computational−state,r,n)
==========================
/*リモートノードは、継続を受信するためのメッセージをnから得る。注:この場合のcは、継続のコンテンツであり、継続自体ではない。*/
c=InitContinuation/*要求内の情報を用いる*/
c.state=computational−state
e=insert c into the local event−table
handle−event(e)
end on−migrate−computation
==========================
on−interrupt(i)
==========================
/*(物理ノードnのサブツリー内の)プロセッサpが(特定のハードウェア設計に特有の非常に低レベルのメカニズムを用いて)iによって割り込まれた時、pは、以下の通りにする:*/
while valid(i)
e=event−table(i)/*iに対応するイベントを見つける*/
handle−event(e)
i=next−queued−interrupt
end while
/*前の実行を再開する*/
return−from−virtual−interrupt:
end on−interrupt
==========================
handle−event(e)
==========================
/*イベントが発生した。イベントテーブルから最良のスケジューラオブジェクトへそのイベントを移動させる。*/
c=e.continuation /*イベントeのための継続を見つける*/
event−table(i).clear=true/*テーブルからイベントを除去する*/
e.complete=true/*eを完了としてマークする*/
c.state=ready
/*ここで、cを置くのに最良の場所を見つける*/
s=c.last
initialize(best−guess)
/*最良の選択を探す*/
/*ルートのローカルにキャッシュされたコピーがあると仮定する*/
repeat
guess=cost(s,c)
if guess>best−guess
then
best−guess=guess
best−s=s
s=parent(s)
until s=nil
insert−queue(best−s,c)/*最良のsの待機キューにcを入れる*/
end handle−event
==========================
request−resource(r,n)
==========================
/*ノードnが、ノードn’によって所有されるリソースrを必要とする場合、そのリソースは要求されるが、他の誰かが先を越して要求した可能性があるか、または、n’が現在それを利用しているために、その要求は満たされない場合がある。*/
current−resource−map(r).wanted=true
request−transfer(owner(r),r) /*rのオーナに要求を送信する*/
/*rの移送を要求する*/
return
==========================
on−request−transfer−response(r,m,is−rejected)
==========================
/*ここで、あなたはリソースrについてのノードへの以前の要求からの応答を得るノードであることを考慮する。この要求への応答が来ると、それは、受け入れられるかまたは拒否されうる。*/
if is−rejected
then/*リソースがmに移送された*/
increment k
if k>threshold
then
/*あなたは永久に追求したいとは思わない*/
/*リソースを得ようとする。諦める*/
migrate−computation(r,m)
return
else
request−transfer(r,m)/*再試行する*/
return
else
/*要求が拒否されなかった。rはリソースである*/
r.k=0
r.wanted=false/*リソースが移動された*/
r.owner=me/*オーナをn(すなわち、「私」)に設定する*/
if the resource is memory,
update the hardware memory map with the new memory
return
==========================
on−transfer−requested(r,n)
==========================
/*rへのリソース要求がノードnから来た時、オーナ(r)にとって移送が進行中であれば、要求を拒否する*/
if r.being−transferred
then
send−request−response(r,owner(r),true)
else
/*リソースの移送が受け入れられる */
r.transferring=true
initiate−send−resource(r)
if type(r)=memory
then update local memory map
send−request−response(r,owner(r),false)
return
==========================
on−resource−transferred(r,n)
==========================
/*移送が完了した旨の肯定応答が来た時*/
r.owner=n
r.transferring=false
return
==========================
on−receive−resource(r,n)
==========================
/*ここで、要求されたリソースrを伴うメッセージをnから受信する*/
r.k=0
r.wanted=false/*それが求められていることを示すビットをクリアする*/
r.owner=me/*オーナをn(すなわち、「私」)に設定する*/
if the resource is memory,
update the memory map with the new memory
send−resource−transferred(r,n)
handle−event(r.e)/*待っていたイベントが発生した*/
return
選択的リソースマイグレーションを用いたネットワーク接続型メモリ
一連の緊密に結合されたサーバのクラスタ(本明細書では「タイダルポッド(TidalPod)」とも呼ぶ)が集合的なリソースのセットを共有するハードウェアおよびソフトウェアのアーキテクチャの実施形態の例について上述した。これらのリソースは、プロセッサ、ダイナミックメモリ、ストレージ、および、ネットワークなど、いくつかのタイプを含む。かかるシステム内のハイパーカーネルによるこれらのリソースの集約は、一連のノードにわたる仮想マシンの構築を可能にし、オペレーティングシステムおよびアプリケーションにとっては単一の大型サーバに見える。
本明細書には、ハイパーカーネルによるリソースの集約を拡張して、フラッシュメモリ、PCM(相変化メモリ)、3D−Xpoint、ハードディスクドライブなどのメモリ技術を含めるための技術が記載されている。フラッシュメモリを含む実施形態の例を以下に記載するが、本明細書に記載の技術は、適用できる場合、任意のタイプのメモリ技術に対応するように様々に適合されうる。
実施形態の一例において、フラッシュメモリが、物理的バイト配列として構造化される。この配列の各バイトは、クラスタの各サーバ(本明細書では「ノード」とも呼ぶ)上で実行する1セットのハイパーカーネルによって生成された仮想マシン内の物理メモリアドレスに対応する。
通例、フラッシュメモリは、以下の2つの主な方法で用いられる。ソリッドステートディスク(SSD)として、または、携帯電話およびタブレットなどの携帯型電子デバイス内の永続性メモリとして用いられる。サーバ内のフラッシュの主な利用法の一例は、ディスクのシミュレートである。本明細書では、(a)ゲストオペレーティングシステムによって認識されるメモリのサイズを、クラスタの利用可能なダイナミックメモリの合計サイズを超えて拡張することによって、大型メモリをアプリケーションおよびデータベースにとって利用可能にするために、ならびに、(b)エラーの存在下でのシステムの回復力を高めるための方法として、例えば、永続性のバックアップメモリとして、フラッシュを用いるさらなる方法を提供する技術が記載されている。
残念なことに、サーバのためのほとんどのシステムソフトウェアは、メモリ階層の第1クラス要素としてフラッシュを効果的に扱うためのメカニズムを持っておらず、結果として、このソフトウェアは、それが良く理解する方法(すなわち、ディスクストレージ)でフラッシュを利用することに頼っている。
利用例
以下は、本明細書に記載する技術によってサポートされるいくつかの利用例である。
1.例えば、5TBのメインメモリを備えたソフトウェア定義サーバと、10TBのフラッシュメモリアレイとを考える。実施形態の一例において、サーバは、10TBのメインメモリを有し、その5TBのメインメモリを10TBのフラッシュメモリの新たなキャッシュとして有するよう構成される。かかるキャッシュの利用は、システムを高速化する。
2.別の実施形態において、フラッシュメモリアレイは、合計で15TBのメインメモリにするための追加のメインメモリであるかのように用いられてもよい。
3.実施形態の別の例において、フラッシュメモリは、永続性の参照メモリを実装するために用いられてもよい。例えば、システムが差し迫った欠陥を検出した場合、フラッシュメモリのコンテンツは、すでに持っていないメインメモリの最新(最も最近)のページで更新されてよい。このように、システムが再起動する時、永続性メモリは、以前に保存された状態にシステムを復元するのに役立つように利用されうる。したがって、メインメモリは、クラッシュ、エラー、または、その他の障害の際にシステムを容易に再起動できるように、永続性ストレージにバックアップされうる。
例えば、通例は、障害(例えば、停電またはシステムクラッシュ)の場合、揮発性(例えば、揮発性メモリのコンテンツは、電力がなくなると失われる)であるDRAM(ダイナミックランダムアクセスメモリ)などのダイナミックメモリのスナップショットが撮られて、ディスクに書き込まれる。これは、フラッシュメモリなどの永続性(例えば、スタティック、不揮発性)メモリを含むネットワーク接続型メモリに参照コピーを格納またはフラッシュできることから、本明細書に記載の技術を用いて避けることができる。ネットワーク接続型メモリに関する詳細については、後に詳述する。
4.実施形態の別の例において、本明細書に記載の技術は、ノードの状態を保存し、そのノードを別のノードで置き換えるために用いられてもよい。これは、ノードのアップグレード、欠陥ノードの交換など、様々な理由でなされてよい。
メモリ階層
上で提示したアーキテクチャ例において、大きい「物理」アドレス空間が、ゲストオペレーティングシステムに提示される。クラスタ内の各ノードの視点からは、そのノード上のプロセッサによって直接的にアドレスされる「ゲスト物理」アドレスを有するオペレーティングシステムによって見られるゲスト物理アドレス空間内にアドレスが存在する。いくつかの実施形態において、プロセッサによって要求されたゲスト物理アドレスがそのノード上に存在しない場合、メモリアクセス障害がハードウェアによって引き起こされ、(a)そのアドレスを含むメモリが、プロセッサの位置するノードに移動またはコピーされるか、もしくは、(b)ゲストプロセッサ(すなわち、ゲストプロセッサに相当する仮想プロセッサ)の実行していた計算が、ゲスト物理メモリの位置するノードに移動される。ハイパーカーネルを用いたリソースマイグレーションメカニズムおよび技術の例について上述した。これら2つの戦略のいずれかが、完了すると、計算をスケジュール可能にすることが可能になり、スケジューリングされると、最終的には、メモリアクセス障害が起こらなかったかのように再び動作し始める。
いくつかの実施形態において、このモデルでは、任意の所与の時間に、「ゲスト物理」メモリが、システム内の多くとも1つのノードによって所有される。他のノードが、このメモリのコピーを有してよいが、いくつかの実施形態では、強力なキャッシュコヒーレンシを維持するために、ゲストプロセッサがページを修正する時に、すべての他のコピーが無効としてマークされるか、または、他の方法で忘却される必要がある。
いくつかの実施形態において、システム内のダイナミックメモリの各ページは、或る他のメモリ(すなわち、代替フラッシュメモリまたはネットワーク接続型フラッシュメモリ)のローカルコピーでありうる。このフラッシュメモリは、クラスタ内のノードすべてにアクセス可能なフラッシュ機器の中心に配置されてもよいし、クラスタ全体にわたって1または複数のノード上に分けて(例えば、1または複数のノード上のフラッシュメモリを含むPCIカード上に)分散されてもよい。
かかるフラッシュメモリアレイは、本明細書では、一般性を失うことなく、「ネットワーク接続型メモリ」と呼ばれる。ネットワーク接続型メモリ(本明細書では「NAM」とも呼ぶ)自体は、クラスタのノードの間に分散されたメモリの1以上のバンクで構成されてよい。様々な実施形態において、ネットワーク接続型メモリは、適用可能であれば様々に適合された本明細書に記載の技術と共に、上述したようなPCM、3D−Xpoint、ハードディスクドライブなどのメモリ技術を用いて実装されうる。ネットワーク接続型メモリの一例について、以下に詳述する。
ネットワーク接続型メモリは、タイダルポッド内でさらなるメモリ層として利用できる。実施形態の一例において、ネットワーク接続型メモリは、システム(例えば、タイダルポッド)内のすべてのメモリの「実際の」ホームと見なされうる。ネットワーク接続型メモリが、このように見なされる、用いられる、または、構成される場合、ネットワーク接続型メモリの部分が、各ノード上に、例えば、ノードのダイナミックメモリ内に、一時的に存在してよい。このように見なされる場合、各ノード内のメモリは、いくつかの実施形態において、ネットワーク接続型メモリのキャッシュとして利用できる。
ネットワーク接続型メモリ機器の一例について、図14に関して後に詳述する。
したがって、様々な実施形態において、通常のメモリ階層は、各ノード上にキャッシュレベルを有するだけの構成から、緊密に結合されたノードにわたってキャッシュレベルを有する構成へ拡張される。
ネットワーク接続型メモリの利用における本明細書に記載の技術の結果の一例は、例えば、クラスタのダイナミックメモリ容量が、必ずしも各ノード上の物理一次メモリすべての合計ではなく、オペレーティングシステムに提示されている仮想マシンと1:1対応するという要件例により、ネットワーク接続型ストレージのメモリが、クラスタの利用可能なダイナミックメモリを大幅に拡張できるということである。
強力なキャッシュコヒーレンシ
いくつかの実施形態において、オペレーティングシステムおよびアプリケーションが適切に機能するために、メモリ階層全体が、強力にキャッシュコヒーレントである必要がある。典型的なハードウェアにおいて、プロセッサは、1または複数のレベルのハードウェアキャッシュを用いて同期された強力なキャッシュコヒーレンシを維持する。2以上のプロセッサがノード上に存在する場合、既存のハードウェアを用いて、キャッシュコヒーレンシが、AMD社のHypertransport(商標)またはIntel社のQuickPath Interconnect(商標)などのオンボード相互接続を介して維持される。
しかしながら、それらのスキームは、単一のノード(すなわち、プロセッサおよびメモリを有するノード)を超えては拡張しない。本明細書では、上述のメカニズムを用いて同様の効果を達成する強力なコヒーレンシプロトコルのソフトウェアバージョンが記載される。
いくつかの実施形態において、オペレーティングシステムの指示の下で実行中のプロセッサが、そのローカルメモリ内の位置に書き込む時に、そのメモリのコピーがそのノード上のプロセッサのハードウェアキャッシュに格納される場合、複数のプロセッサが、ローカルキャッシュの強力な整合性を維持するよう協調しなければならない。
上述の技術(例えば、上述のハイパーカーネル)を用いて、同様の動作を行うことができる。例えば、ゲストオペレーティングシステムの指示の下で実行中のゲスト仮想プロセッサが、自身がそのローカルメモリであると考えるメモリ内の位置を書き込む時に、そのメモリがノードのダイナミックメモリ内にある場合、1つの真正なコピーがゲスト仮想マシン内の1つの場所のみに維持されるように、そのメモリのローカルコピーを有する任意の他のノードがそのローカルコピーを確実に無効化するよう注意する必要がある。メモリがネットワーク接続型メモリに拡張された時に、同じ書き込みが同じ効果を有することが好ましい。
ネットワーク接続型メモリに対するマイグレーション
本明細書には、ネットワーク接続型メモリの存在下で強力なキャッシュコヒーレンシを維持する方法の概要が記載されている。さらなる詳細を以下に記載する。
いくつかの実施形態において、ノード上の計算が、別のノード上に格納され所有された位置からの読み出しを試みる時、計算の移動またはメモリの移動のいずれかによって、計算およびメモリが同じノードに確実に共在するように、リソースマイグレーションアルゴリズム(上述のものなど)が実行される。
ネットワーク接続型メモリフラッシュ機器を組み込むためにリソースマイグレーションを拡張する技術について以下に記載する。
いくつかの実施形態において、メモリを含むタイダルポッド内のノードのセットは、フラッシュ機器を含むように拡張される。扱われるフラッシュ機器は、システム内の別の異なるリソースタイプである。フラッシュ機器は、いくつかの実施形態において、計算がスケジュールされうる任意の仮想プロセッサを持たないことを除けば、他のノードと同様であると考えることができる。いくつかの実施形態において、ネットワーク接続型メモリ機器は、全く仮想プロセッサから始めることはなく、タイダルポッド内の他のノードから仮想プロセッサを全く受け入れることがない。
図13Aは、ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す。図の例において、タイダルポッド1302のノード1304(ノード458〜462の例)が、永続性メモリアレイ1306(ネットワーク接続型メモリの例)と通信する。いくつかの実施形態において、ノードおよびNAMは共に、タイダルポッドを形成する(ここで、NAMは、タイダルポッド内の特殊なノードである)。いくつかの実施形態において、タイダルポッドのノードおよびNAMは、相互接続(1308)を介して互いに通信する。
実施形態の一例において、ノード1304の各々は、マザーボード(1310)を備えており、ここで、上述のように、マザーボードは複数のプロセッサを有してよく、各プロセッサは、複数のコアを有してよく、各コアは、複数のハイパースレッドを有してよい。いくつかの実施形態において、タイダルポッド上で実行中のゲストオペレーティングシステムは、各ハイパースレッドをプロセッサと見なす。
いくつかの実施形態において、ネットワーク接続型メモリ1306は、メモリ(1312)のアレイ(例えば、フラッシュメモリのバイト)である。NAMは、さらに、本明細書に記載のように、キャッシュコヒーレンシプロトコルを実装するよう構成されたプロセッサ(1314)を備える。複数のNAMが、冗長性および/または復元性のために用いられてよい。この例において、ネットワーク接続型メモリ機器1306は、クラスタ内のノードすべてにアクセス可能であるフラッシュ機器の中心に配置される。別の実施形態において、ネットワーク接続型メモリは、クラスタ全体にわたって1または複数のノード上に分けて分散されてよい(ここで、複数のノード1304にわたって分散されたNAMの部分の例が1316〜1322で示されている)。
本明細書に記載の技術を用いて、メモリのページが、上述のように(例えば、メモリマイグレーションを実行する時に)システム内の任意のノード上に配置されうるように、NAMに配置されてよい。いくつかの実施形態において、ネットワーク接続型メモリ機器は、キャッシュコヒーレンシプロトコルを用いて相互接続を介してタイダルポッド内の他のノードと通信しており、これについては、後に詳述する。
図13Bは、ネットワーク接続型メモリが選択的リソースマイグレーションに用いられるシステムの実施形態の一例を示す。この例において、ノード1352および1354は、ノード1304および458〜462の例である。この例に示すように、各ノードは、ハイパーカーネルを有する。また、L1、L2、および、L3キャッシュを含む各ノード上のメモリまたはキャッシュ階層の実施形態の一例が示されている。各ノードは、さらに、L4キャッシュとして用いられるDRAMを備える。
この例に示すように、ノード1352および1354は、(例えば、相互接続を介して)互いに通信し、例えば、互いの間でリソースを移動させる。この例において、ノードは、さらに、ネットワーク接続型メモリの一例である永続性メモリアレイ1356と通信するよう構成される。タイダルポッドのNAMおよびノードは、本明細書で詳述されるキャッシュコヒーレンシプロトコルを用いて通信する。
図14は、ネットワーク接続型メモリ機器の実施形態の一例を示す。NAMの一実装例は、以下の通りである。NAM(1402)は、ボード上に2D(二次元)アレイに配列された複数のフラッシュメモリチップ(例えば、メモリチップ1404)を備える。この例において、メモリチップは、バンクおよびロウに配列される。メモリチップは、メモリバス(1406)で接続される。メモリバスは、プロセッサ(1408)がメモリコントローラ1410にアドレス(例えば、バンクx、チップY、ページZを特定するアドレス)を発行することを可能にし、次いで、メモリコントローラ1410は、バンク/チップの指定の組みあわせから適切なページを返すよう構成されている。例えば、メモリコントローラは、チップの総数を取得し、それをチップ上のページ数で割る、ロウの数で割る、などして、適切なページを返す。
この例において、NAMに含まれるプロセッサは、タイダルポッド内の他のノードと通信して、例えば、メッセージを受信してキャッシュコヒーレンシプロトコルの一部として応答を提供する(これについては、後に詳述する)よう構成またはプログラムされた特別な制限付プロセッサ、ネットワークプロセッサ、または、プロトコルプロセッサとして実装されるコーディネータである。いくつかの実施形態において、メッセージは、タイダルポッドのノード間で通信される肯定応答、再試行などを含む。メッセージの一例は、ノードn上のvcpuをノードmへ移動させるためのメッセージである。かかるメッセージのための擬似コードの例を以下に提供する:
このVCPU「V」をノードMに移動させる
Vの状態のスナップショットを撮る(通例は、メモリの少数のページ(例えば、〜6400バイト))。
状態VからMを含むのに適切なバイト数(例えば、6400バイト)を持つ「移動」コマンドを送信する
肯定応答を待つ
メッセージのさらなる例およびメッセージ構造の一例を後に詳述する。いくつかの実施形態において、NAMに含まれるプロセッサは、ゲストオペレーティングシステムには見えない。
この例において、NAMは、さらに、メタデータ1412を含む。いくつかの実施形態において、メタデータは、どのページがどの状態にあるのかを追跡するために用いられるページ状態を含む。いくつかの実施形態において、ページ状態は、ページのタイプ(例えば、セカンダリ)を示す。いくつかの実施形態において、NAMは、タイダルポッドにわたる様々なノード上のページの状態を示すメタデータを含む。例えば、NAM上のページのコピーの状態は、通例は、セカンダリである。その他のノード上のページのコピーは、セカンダリ(副)、プライム(主)、または、エクスクルーシブ(排他的)であってよい。この情報は、例えば、フェイルオーバーシナリオで回復を実行する時に、タイダルポッドの状態を復元する(例えば、第2ノード上のページの別のコピーが、セカンダリとマークされるべきである時に、タイダルポッド内の第1ノード上のページのコピーがプライマリ(本明細書では「プライム」とも呼ぶ)とマークされるべきであることを示すために)用いられうる。
いくつかの実施形態において、NAMのすべてのページが、最初は無効である(例えば、タイダルポッドの起動時)。ページがノード上で書き込まれる時、後に詳述するページ/キャッシュコヒーレンシプロトコルに従って、そのページのコピーがNAMに送信される。したがって、時間と共に、ページが作成されタイダルポッドに書き込まれるので、NAMは、作成されて書き込まれたそれらのページすべての最新コピー(例えば、ダイナミックメモリのコピー)を維持する。
いくつかの実施形態において、大型メモリシステムが起動されると(例えば、大型メモリLinuxまたはFreeBSDシステム)、通例は、ページのゼロイングが実行される。この処理は、大型メモリシステムについては長い時間が掛かりうる。いくつかの実施形態において、本明細書に記載の技術を用いれば、より高速かつ効率的にページのゼロイングを実行できる。例えば、ゼロイングは、並列で「遅延して」実行されてよい。いくつかの実施形態において、まだゼロイングされていないシステム内のページが、「休止」ページとして示される。いくつかの実施形態において、これらの休止ページは、最初に利用される(例えば、割り当てられて書き込まれるか、または、作成される)時までゼロイングされない。タイダルポッドシステムは、この「並列遅延ゼロイング」技術を用いることによって高速で起動できる。
いくつかの実施形態において、タイダルポッドシステムが起動した時、休止ページはまだ作成されておらず、したがってまだ存在していない(すなわち、休止ページは、割り当てられるまでは、全く物理的表現を持たない)ので、休止ページのためのエントリは、(後に詳述する)第2レベルページテーブルに存在しない。いくつかの実施形態において、休止ページが割り当てられると、ゼロイングされる。次いで、エントリが、第2レベルページテーブル内に配置され、これにより、ページが有効化して非休止状態になる。
図15は、ページ割り当ての一実施形態を示す図である。この図は、ダイナミックメモリおよびネットワーク接続型メモリに様々に適用される。この例では、休止ページ(1502および1504)が示されている。休止ページが割り当てられると、その休止ページは、(例えば、1506に示すように)ゼロイングされる。次いで、上述のように、エントリが第2レベルページテーブルに配置される。エントリが作成されると、ページの物理アドレスが入力される。いくつかの実施形態において、そのページのためのモードビットも入力される。モードビットは、ページが有効であること、ページが書き込み可能であるか読み出し専用であるか、などを示しうる。
いくつかの実施形態において、タイダルポッドなどのシステムが起動した時、すべてのページは空(例えば、休止中)である。次いで、ゲストオペレーティングシステムは、ページの割り当てを開始する。例えば、ページが割り当てられる時、ページ番号(例えば、4567)が割り当てられる。割り当て後に、ページはゼロイングされ、その後、そのアドレスが、第2レベルページテーブルに入れられる(ページは、ゼロイングされる後まで可視にならない)。ここで、4567としてハイパーカーネルに知られるいくつかのページをアドレスする試みがなされた場合、ゼロのページが見られる。
いくつかの実施形態において、割り当てまで、ページは存在しない。複数のノードおよびプロセッサを備えたタイダルポッドが起動されると、ページの大部分が、起動時に休止する。ページは、利用される時に有効になる。これは、ダイナミックメモリ内およびNAM内のページについてtrueを保持する。
いくつかの実施形態において、NAM内のページ数は、ゲストオペレーティングシステムが観察するページ数と一致する。そのページの他のコピー(例えば、シャドーコピー)が、(例えば、ページキャッシュ内に)存在しうるが、いくつかの実施形態において、それらは、ゲストオペレーティングシステムに対して可視にされない。ハイパーカーネルとNAMとの間に一対一対応がある必要はない。しかしながら、いくつかの実施形態において、ゲストオペレーティングシステムから見える一対一対応が存在する。
典型的なオペレーティングシステムでは、オペレーティングシステムは、ベアメタルマシン上で動作する。上述のように、本明細書に記載の技術を用いると、ベアメタルマシンが、分散型ハイパーカーネルで置き換えられ、これは、ベアメタルハードウェア上で動作しているという印象をオペレーティングシステムに与える。これは、タイダルポッド内のノード上のプロセッサに存在する第2レベルページテーブルによってサポートされる。メモリのページのためのエントリが第2レベルページテーブル内に存在しない場合、ハードウェアアドレス変換を実行する時に障害が生じる。上述のように、例えば、コスト関数に基づいて、メモリを持つページに仮想プロセッサを移動してもよいし、仮想プロセッサがある場所にメモリを移動してもよい。いくつかの実施形態において、メモリが移動される場合、コピーされたメモリのコンテンツだけでなく、宛先(ノード)の第2レベルページテーブルも更新される。したがって、ノード上のプロセスがページへのアクセスを試みた時に、別の障害は生じない。これは、ゲストオペレーティングシステムに対して、単一の大きいアドレス空間の出現を提供し、そのアドレス空間は、ハードウェア内には存在せず、本明細書に記載の技術を用いてソフトウェア内に規定されてサポートされる。ページに対する要求が(例えば、コスト関数に入ったメッセージに基づいて)拒否された場合、プロセッサは、ページのその位置に移動する(または、仮想プロセスおよびページの両方が、別のノードに移動される、すなわち、事後条件で、それらが共在する)。
いくつかの実施形態において、ページが要求される時、ページは、そのプライマリ位置から要求される。次いで、そのページは、セカンダリとしてマークされるが、要求側ノードに送信されたページは、要求側ノード上でエクスクルーシブまたはプライムとしてマークされる。
以下の例を考える。説明のため、タイダルポッドが、集中型のネットワーク接続型メモリと、2つのノード(ノード1およびノード2)とを備えると仮定する。いくつかの実施形態において、最新のコピーがノード2上にあるメモリ(すなわち、メモリのページ)の移送をノード1に要求させるように戦略決定がなされた場合、ノード2は、まず、ノード1が最新のコピーを見つけることができる場所または位置である可能性が最も高い旨の示唆と共に、そのメモリの無効化をネットワーク接続型メモリに送信し、次いで、そのメモリのコピーをノード1に送信することによってノード1の要求を満たす。いくつかの実施形態において、現在ノード1上にあるメモリは、ノート1上にある様々な計算によって指示されるように更新され、次いで、ノード1がそのメモリをどこか他の場所に移動しなければならない時に、ノード1は、さらに、そのメモリの現在のバージョンが見つかりうる場所にそのネットワーク接続型メモリを更新してよい。いくつかの実施形態において、システム(タイダルポッド)は、システムの知識が完全ではない場合があるので、更新がNAMになされるかどうかに関係なく作業または機能し続ける。一部の場合には、非同時性のために、メモリページは、(例えば、リソースマップに従って)予測された位置にない場合があるので、「追求」および検索される必要がありうる。例えば、或る時点に、ページは、所与の位置にあった可能性があるが、ページの検索がなされた時に、もはやそこにはない場合がある。
別のノードがそのメモリ(ページ)のコピーを必要とする場合、コピーが、要求側ノードに送信され、メモリのコピーも、ネットワーク接続型メモリへ送信される。
いくつかの実施形態において、メモリがノード上で修正されると、そのメモリは、そのノードに専用になる。いくつかの実施形態において、ネットワーク接続型メモリ上の任意のコピーを含む、すべての他のコピーが、無効化する必要がある。
いくつかの実施形態において、定期的に、ネットワーク接続型メモリは、すべてのメモリページのセカンダリコピーを要求してよい。計画されたシャットダウンまたは計画外のシャットダウン時に、十分な時間がある場合、ネットワーク接続型メモリは、ゲスト仮想プロセッサが停止された後に、すべてのページの排他的所有権を要求してよい。
このように、ネットワーク接続型メモリは、常に、強力なコヒーレンシのセマンティクスを維持するのに十分に新しいコピーを含む。
状態遷移およびキャッシュコヒーレンシプロトコルの説明
上述のように、ネットワーク接続型メモリ(「NAM」)は、その上で開始されうる仮想プロセッサ(本明細書では「vcpu」とも呼ぶ)がなく、そこに移動しうるvcpuがないことを除けば、タイダルスケールポッド(TidalScale Pod)内の別のノード(集中ノードまたはポッド内の他のノードにわたって分散されたノード)であってよい。
この例において、NAMは、vcpuがNAM上に存在しないと仮定すると、本質的にトランザクショナルメモリである。いくつかの実施形態において、ゲストソフトウェアの実行によって規定される明確な同期点(例えば、「計算を進めるためにこのページを必要とし、それを得るまでは計算を進めることができない場合」)を除けば、NAMのコンテンツをリアルタイムで最新に保つ要件も必要もない。したがって、NAMに対する読み出しおよび書き込みは、「遅延して」実行されてよい。ページの要求およびページを更新する要求が順序正しく満たされる限りは、一貫したフォンノイマン・セマンティクスをリアルタイムで実行する必要なしに、それらを維持または保持できる。一部のプロセッサファミリーが、満たす必要のあるさらなる制約(例えば、インテルの「メモリ格納順」制約)を有している場合もありうる。
いくつかの実施形態において、ページを要求する、ページを更新する、プロセッサを移動させる、ページの読み出し専用コピーを無効化する、などのためのロジックは、vcpuまたはハウスキーピングスレッドによって処理される。NAMは、それらを持たないので、これらの動作の心配をする必要はない。
ここで、トランザクション構造の実施形態の一例を記載する。
任意のノード上のページは、有効または無効でありうる。ページの有効/無効とは、そのページへのエントリがノード上の或るページテーブルに存在するか否かを指す。ページが有効である場合、それらのページは、ゲストオペレーティングシステムが物理アドレスであると認識するが、実際にはハイパーカーネルから見るとゲスト仮想アドレスであるアドレスに対応する。
ノードn上にある有効なページpは、いくつかの状態の内の1つの状態にあってよい:プライム(またはプライマリ)もしくはエクスクルーシブもしくはセカンダリ。
1.pが「プライム」とマークされた場合、「読み出し専用」であり、nはpを「所有」すると言われる。
2.n以外のノードが、pのコピーを有してもよく、これらのコピーは、「セカンダリ」とマークされるかまたは呼ばれる。いくつかの実施形態において、セカンダリがある場合、タイダルポッドの他の場所にプライムがあると有効に仮定されうる。同様に、ノードがプライムページを有する場合、タイダルポッドの他の場所にそのページのセカンダリがあると仮定されうる。いくつかの実施形態において、セカンダリの数は、それらのページを読み出す試みがなされた時に、ページデータがすでに要求側ノードにあることで、ページデータへのアクセスに費やす時間を最小限にするように最大化される。
セカンダリが望まれうる一例は、オペレーティングシステム(例えば、ゲストオペレーティングシステム)のコードを保持する1セットのページを処理する場合である。オペレーティングシステムのためのコードは、不変であり変化しないので、オペレーティングシステムを実行するプロセッサがオペレーティングシステムのためにページをフェッチする場合に不十分である(この結果として、プロセッサが、要求されたページを待っている間に、ストールが生じうるため)。その代わりに、効率を改善し、ストールを低減するために、セカンダリを利用可能であり、ここで、オペレーティングシステムの可能な限り多くのページが複製される。ストールを低減することにより、システムにおけるオーバーヘッドも削減され、システムの効率の改善につながる。
読み出し専用データ(ここで、読み出し専用データのページは読み出し専用ノードにセカンダリとしてコピーされる)を含むプログラムなど、他の種類のプログラムに対して、同様の最適化および効率化を実行できる。いくつかの実施形態において、メモリの読み出し専用ページであるオペレーティングシステムまたはアプリケーションのコードページの間に区別はない。
別の例として、あまり頻繁に変化することのない大量のデータを有するセカンダリを利用できる。メモリがそれに利用可能である場合、効率を改善し、ストールを低減するために、可能な限り多くの読み出し専用データを複製できる。
3.pがn上でエクスクルーシブとマークされた場合、ページはn上にだけ存在することができ、他のコピーは存在することができず、ページは読み出しおよび書き込み可能である(「読み出し−書き込み」)。この場合、pのセカンダリはない。
いくつかの実施形態において、ページがエクスクルーシブにされる前に、そのページのすべての他の既存のコピーを無効化するために、無効化動作が実行される。これは、既存のアーキテクチャにおける評価順序を保証するために利用されうる。無効化動作は、すべての他のノードにメッセージを送信して、そのページのそれらのコピーを無効化するように要求することによって実行されうる。それらの要求に対する応答(例えば、肯定応答)が受信された場合、すべてのそれらの応答の受信は、ページが存在する位置が他にないことを示唆する。次いで、ゲストオペレーティングシステムは、再び起動して、そのページに書き込むことができる。書き込みが完了すると、他のページが、そのページのコピーを有することを望む場合があり、いくつかの実施形態で、ページのスナップショットが撮られ、そのページについて更新された情報を有する新たなセカンダリを作成するために利用されうる。したがって、セカンダリの利用により、ゲストオペレーティングシステムにとっては、それらのページがローカルであるように見える。
ノードm(m≠ n)上のvcpuが、pへのアクセスをnに要求した時に、そのページがプライムまたはエクスクルーシブである場合、現在n上にあるページpは無効とマークされ、次いで、そのページのコピーがmに送信され、mは、pをプライムとしてマークする。いくつかの実施形態において、最適化として、ノードm上のvcpuは、そのページが必要とされているものであるとノードm上のvcpuが知っている場合に、ページpをエクスクルーシブとしてマークしてよい。
いくつかの実施形態において、ノードが、プライムまたはエクスクルーシブであるページを有する場合、そのノードが、そのページへのプライムまたはエクスクルーシブの書き込みを送信する要求を受信すると、ページは、そのノード上でセカンダリに変換される。次いで、そのページへの書き込みの権利は、ページを要求しているノードに移される。これは、ノードがページに書き込もうとしていない限りはページを要求していないという仮定に基づいて実行されてよい最適化である。これは、実行される必要のあるプロトコル内にトランザクションを保存し、効率を高める。
いくつかの実施形態において、ノードmがpへのアクセスをnに要求した場合、ノードnは、自身のpのコピーをセカンダリとしてマークする。次いで、ページpは、ノードmに送信される。ノードmが自身のpのコピーをエクスクルーシブまたはプライムとしてマークすると、ノードnのページpのコピーは無効化される。
いくつかの実施形態において、ノードn上のページpがプライムであり、書き込まれる場合、すべてのセカンダリコピーが、無効化されなければならず、これが完了した旨の肯定応答を受信した後にのみ、nは、pをエクスクルーシブとマークする。例えば、いくつかの実施形態において、そのページは、ノードnが唯一の書き手であることが知られるまで書き込みできない、すなわち、ページは、そのページがエクスクルーシブ状態になるまでは書き込みできず、ここで、ページは、他のセカンダリがない(すなわち、すべてのセカンダリが無効化されている)ことを示すすべての肯定応答が受信されるまで、エクスクルーシブ状態になれない。いくつかの実装例において、これは最適化されうる。例えば、このページにとってプライマリ(最上位)であるノードが、無効化を開始できる。いくつかの実施形態において、無効化は、肯定応答が現在のプライマリではなく(まさにプライマリになろうとしている)要求側に送信される命令を含む。いくつかの実施形態において、要求側は、ページにアクセスできる前にすべての肯定応答を収集しなければならない。このように、無効化は、ページの移送と並行して安全に進行しうる。要約すると、この最適化の例においては、プライマリが無効化を開始するが、要求側が無効化処理を完了させる。
以下は、無効化に関するさらなる詳細である。いくつかの実施形態において、タイダルポッドは、第1レベルページテーブルを備えており、これは、ユーザ空間(例えば、ユーザ空間でのゲストプログラム実行)から、ゲストオペレーティングシステムがその物理空間であると考えるものへ、ハードウェア翻訳を実行する(すなわち、第1レベルページテーブルマッピングが、ゲストOSが物理アドレスであると考えるものに仮想アドレスを翻訳する)。上述のように、ゲストOSが物理アドレスであると考えるものは、ハイパーカーネルによって管理されたゲスト物理アドレス(例えば、ハイパーカーネルホストアドレス)であり、それらのアドレスは、次に、ハードウェアにおいて(例えば、第2レベルページテーブルを介して)、別のレベルのページアドレス翻訳を受けて、そこで、ゲスト物理アドレスは、ページの真の物理アドレスに変換または翻訳される。いくつかの実施形態において、ページは、第2レベルページテーブルからそのページを消去することによって無効化される。ノードは、メモリの無効化されたページにもはやアクセスできないので、次に、ガベージコレクションが実行されてもよいし、メモリがフリープールなどに戻されてもよい。
この後、そのノード上ではローカルに読み出しおよび書き込みが可能であり、他のコピーが存在しない(例えば、上述のように、第2レベルページテーブルからページを消去することによってページが無効化されている)ので、エクスクルーシブとマークされたページへのすべての書き込み動作が、全くストールを起こさない。
いくつかの実施形態において、NAMは、上述したのと同じプロトコルに従う。タイダルポッド内の任意の他のノードに関しても、NAMは、有効なページおよび無効なページを有する。例えば、
1.NAM内のすべてのページが、無効として始まる。いくつかの実施形態において、ページが有効になると、NAM上のそのページには書き込みできなくなる(読み出し専用になる)ので、セカンダリとしてマークされる。
2.ノードn上のvcpu vがページに書き込む前に、そのvcpuは、NAMを含む他の場所のPの全コピーを無効化しなければならない。したがって、NAMがpのセカンダリを有する場合、pは、NAM上で無効化される必要があり、pのコピーを有する任意の他のノードと同様に、pが更新されうる前に無効化された旨の肯定応答を送信しなければならない。
3.ノードnが、ページにpに対するノードm(m≠ n)からの読み出し要求に応答する場合(ここで、pはプライマリまたはエクスクルーシブとマークされている)、nは、pをセカンダリとしてマークし、ページpをmに送信し、さらに、(ほぼ)同時に、それをNAMへも送信し、NAMは、それを有効およびセカンダリとしてマークする。したがって、いくつかの実施形態において、ノードがエクスクルーシブまたはプライマリとしてページをマークすると、ネットワーク接続型メモリが、そのページの有効なコピーを有するように(すなわち、(例えば、ページへの書き込み後に)ノードがページのプライムコピーを有する場合に、NAMが、書き込み後に有効なセカンダリコピーを有するように)、そのページのコピーが、ネットワーク接続型メモリに送信される(そして、セカンダリとしてマークされる)。ページがmによって受信された後、mは、そのページをプライマリとしてマークする。すでに述べたように、ページが、リモート書き込み要求の場合のように、プライマリからエクスクルーシブへと遷移した場合、NAM上のセカンダリコピーは、無効化されなければならない。ページがエクスクルーシブとマークされることが前もってわかっている場合、ページをNAMへ送信する工程が省略されてもよい(いずれにしても、最終的に無効化されるため)。
このように、NAMは、タイダルポッド内のすべての有効なページのコピーの経時的なコレクションになる。いくつかの実施形態では、ページが更新される度に、ネットワーク接続型メモリへの更新がなされる。したがって、時間と共に、休止期の後に、ネットワーク接続型メモリは、タイダルポッド内のすべてのページの有効なコピーを有することになる。したがって、システムへの電力供給が途絶えても、メモリのイメージがNAM内に存在する。別の例として、起動時、クリーンシャットダウンが実行されなかった場合、メモリのスナップショットが、シャットダウンの前にシステムの以前の状態を復元する助けとして用いられてよい。
最後に、タイダルポッド内のNAMの数には制約がない。例えば、システム内に(例えば、復元性および/または冗長性のために)複数のNAMがあってもよい。いくつかの実施形態において、いくつかのネットワーク接続型メモリが、異なるタイダルポッド間で共有されてもよい。一例として、NAM機器が、復元性および/または冗長性のために、プラグを抜かれて複製されてもよい。
例えば、データが、ストレージから引き出された(例えば、ファイルから抽出された)時、そのデータは、そのデータに対して動作するアプリケーションまたはデータベースによって利用可能なローカル表現に変換されてよい。一利用例において、データが変換され、NAMに複製されると、NAMはプラグを抜かれて、別のタイダルポッドへ移動されることができる。したがって、変換されたデータは、すぐに他のタイダルポッドによって利用可能であるため、最初に生データを変換する高コストが節約される。例えば、データを必要とするタイダルポッド上で実行中のアプリケーションによって利用できるように後に変換しなければならない(例えば、データベースからの、インターネット経由のストリーミングによる、ディスクから読み出した、などの)データの最初のロードには、特に非常に大きいファイルについては、高いコストが掛かりうる。この最初のロード/変換は、上述の工程を用いて省くことができる(例えば、一度実行するだけでよく、変換されたデータは、複製可能であり、NAMの移動によって他のシステムに移動することもできる)。
状態遷移の例
上の表1の例において、エクスクルーシブページの読み出し要求が受信されると、そのページが要求側に送信され、(読み出し要求を受信したノード上の)そのページのステージが無効に遷移される。いくつかの実施形態において、無効への遷移は、上述のように、最適化を考慮し、その最適化では、要求されたページに書き込みが行われる仮定がなされ、要求を受信したノード上のそのページは、いずれにしても最終的に無効化される必要がある。別の実施形態において、読み出し要求の受信に応答して、読み出し要求を受信したノードは、エクスクルーシブからセカンダリにページの状態を遷移させる。
いくつかの実施形態では、タイダルポッドのすべてのノードが、本明細書に記載のキャッシュコヒーレンシプロトコルに対する上の例の状態遷移図に従う。NAMの場合、計算(例えば、それが保持するページ上の書き込み)を実行せず、NAMは、受動的動作に関連した一部の遷移に従う。
メッセージ例
以下は、上述のノード間キャッシュコヒーレンシプロトコルで用いられるメッセージの例である。
いくつかの実施形態において、各サブシステムは、独自のメッセージタイプを有する。以下は、タイダルポッド内のサブシステムの例である(例えば、スケジューラサブシステム、I/Oサブシステム、マイグレーションサブシステム、など)。
TS_NET_SCHEDULER,
TS_NET_MEMORY,
TS_NET_IO,
TS_NET_MIGRATION,
TS_NET_REMOTE,
TS_NET_REMOTE_INIT,
TS_NET_IOAPIC,
TS_NET_CONTROL,
TS_NET_BENCHMARK,
TS_PAGE_BENCHMARK,
TS_SYNC_CLOCK,
TS_NET_MMIO,
いくつかの実施形態において、TS_NET_MEMORYサブシステムは、以下のメッセージタイプ例を有する:
VMEM_UNKNOWN=0,
VMEM_BUILD_GCPP=1,//そのccp(コヒーレンシページプロトコル)を構築するためのノードへのメッセージ。
VMEM_BUILD_COMPLETE=2,//構築が完了した旨のメッセージ
VMEM_MOVE_OWNER=3,//オーナからオーナへページを運ぶメッセージ
VMEM_COMPLETE_PAGE=4,//ページ状態変更完了を伝えるために用いられるメッセージ
VMEM_OK2SEND=5,//ページに利用可能な余地をブロードキャストするために用いられるメッセージ
VMEM_COLLECT_PAGE_BCST=6,//隔離プロトコル(コレクトメッセージがブロードキャストされるパス)で用いられるメッセージ
GTHREAD_COLLECT_BCST=7,//ゲストスレッドメタデータを収集するために用いられるメッセージ
GTHREAD_COLLECT_BCST_ACK=8,//ゲストスレッドコレクトメッセージへの応答に用いられるメッセージ
シナリオの例
図16は、上述したようなキャッシュコヒーレンシプロトコルに従った(例えば、上の表1における状態遷移に従った)ノード間通信の実施形態の一例を示す。
この例では、タイダルポッドが、ノードN0(1602)、N1(1604)、および、N2(1606)と、NAM1608と、を備えると仮定する。
初期状態1610において、ノードN2は、ページpのプライマリバージョン(「P」で示される)を有する。ノードN1は、ページpのセカンダリコピー(「S」で示される)を備える。ノードN0は、ページpのコピーを持たない(例えば、無効、「X」で示される)。NAM1608は、ページpのセカンダリコピー(例えば、システムが使用されており、NAMがページpの参照コピーを有する)を備えてもよいし、そのページは、(例えば、起動時に)NAM上で無効であってもよい。
次の工程1612において、ノードN0は、ページpのローカル読み出しの実行を望む。ノードN0は、ページpの有効なコピーを持たないので、ページpのプライマリコピーを有するノード(この例では、(例えば、リソースマップに基づいて)ノードN2)へのページのリモート読み出し要求を実行する。
リモート読み出し要求に応答して、ノードN2は、自身のページpのコピーをセカンダリとしてマークし(プライマリからセカンダリへ遷移させ)、ページpをノードN0に送信する。ノードN2は、NAMにもページpを送信し、NAMは、受信したページpのコピー(例えば、スナップショット)を有効かつセカンダリとしてマークする。ノードN0がページpを受信した後、ノードN0は、自身のページpのコピーをプライマリとしてマークする。
いくつかの実施形態において、ノードN0は、セカンダリとマークされたページpのコピーを受信する。別の実施形態において、この例に示すように、トランザクション(例えば、ノード間で通信されているメッセージ)の数を最小化するために、ノードN0は、ノードN0がページへの書き込みを意図してページを要求しているという仮定の下、自身のpのコピーを直接的にプライムとしてマークする。次いで、ノードN2上のページpは、セカンダリとしてマークされる。ページpがNAM上で無効であった場合、ページpはNAMにも送信され、ここで、セカンダリとマークされる。ページがNAM上に存在する場合、そのページはセカンダリのままである。ノードN1上のページpのコピーはセカンダリのままである。
次の工程1614において、ノードN0は、自身のページpのプライマリコピーにローカル書き込みを実行する。ノードN0が、自身のページpのコピーへの書き込み、または、その更新を実行しうる前に、ページpのすべてのセカンダリコピーが無効化される。例えば、無効化メッセージが、N1、N2、および、NAMに送信される(すなわち、pのセカンダリを有するタイダルポッド内の他のノードが、それらのページpのコピーを無効化するよう要求される)。ノードN0は、N1、N2、および、NAMから、それらのpのコピーを無効化した(すなわち、タイダルポッド内にpの他のコピーが存在しない)旨の肯定応答を受信した後(ここで、それらのノード上の無効化は、記号「X」で示されている)、自身のページpのコピーをエクスクルーシブとマークし(例えば、プライマリからエクスクルーシブへ遷移させ)、ページpのコピーに書き込むことができる。
上記の例において、ノードN0は、最初に、工程1612においてリモート読み出し要求を実行し、その後、工程1614においてローカル書き込みを実行した。ノードN0上のページがエクスクルーシブとマークされることが前もってわかっている場合(例えば、リモート読み出し要求と同様)、ノードN2からNAMへページpを送信する工程1612は、省略されてもよい。
ここで、工程1616において、N1がページpのローカル読み出しを実行しようとすると仮定する。しかしながら、そのページpのコピーは、無効である。次いで、ノードN1は、ノードN0にページpを要求する。リモート読み出し要求に応答して、ノードN0は、自身のページpのコピーをセカンダリに遷移させ(または、いくつかの実施形態においては、要求側がpに書き込むと予測される場合に、自身のページpのエクスクルーシブコピーを無効化し)、ページpをノードN1へ送信する。ノードN1は、受信したページpのコピーをプライマリとしてマークする。ノードN0は、NAMにもページpのコピーを送信し、NAMは、自身のページpのコピーを有効およびセカンダリとしてマークする。
上の例に示したように、1つのページが、タイダルポッドの異なるノード上で異なる状態にあってもよい。いくつかの実施形態では、並列データ構造が、タイダルポッド内の様々なノード上のページの状態に関するメタデータを維持するために用いられる。いくつかの実施形態において、その構造は、タイダルポッド内のノードにわたるページの状態の再計算を実行する必要がないように維持される。
この実施形態の例においては、NAMは受動的であり、ページを要求して書き込むようには構成されていない。NAMは、時と共に、セカンダリページのセットを構築する。ノードがページに書き込もうとした場合、NAM上のコピーは無効になる。
いくつかの実施形態において、NAMは、キャッシュコヒーレンシプロトコルを用いて、プライマリまたはエクスクルーシブからセカンダリへの任意の遷移を通知される(すなわち、NAMは、それらの遷移時にコピーされる)。したがって、NAMは、エクスクルーシブまたはプライムからセカンダリへのページの遷移が起きるといつでも更新される。ノードN上のページpがセカンダリになった場合、NAM上のページも、セカンダリになるように更新されなければならない。したがって、NAMは、自身が有効であると考える1セットのページの状態を維持しており、いくつかの実施形態において、NAMは、タイダルポッドのオフィシャルメモリの「最終的な」参照コピー(または近似)を有する。
いくつかの実施形態において、タイダルポッドが障害または故障を起こしていることが検出された場合、NAMは、NAMがまだ持っていない、タイダルポッド内のすべてのプライマリページのコピーの読み出し要求を行い、それらのコピーは、NAM上でセカンダリとしてマークされる。十分な時間があれば、これにより、NAMは、タイダルポッド内のノード上のページのすべてのセカンダリコピーを有する(そして、例えば、「最終的な参照コピー」になる)ことになる。一例として、障害またはエラーが検出されたと仮定する。NAMは、どのページが無効であるかを判定するために、自身のページすべてを検索する。NAMは、タイダルポッド内の他のノードに、それらのページのコピー読み出し要求を行うことによって、それらを有効にしようとする。コピーが他のノードから取得された場合、NAMは、取得したページのコピーで自身の無効ページを更新し、そのコピーは、その後、NAM上で有効かつセカンダリにされる。
いくつかの実施形態において、NAMは、例えば、システムシャットダウンまたは電源喪失中に、NAMが機能し続けることを可能にするマザーボード上のバッテリなど、バックアップシステムを備える。これは、(無効ページから有効セカンダリへの遷移のために)タイダルポッド内の他のノード上のページのセカンダリコピーを要求する時間をNAMに提供する。これにより、NAMは、障害の状況下で自身を完成させることができる。
図17は、ネットワーク接続型メモリの存在下でキャッシュコヒーレンシを維持するための処理の一実施形態を示すフローチャートである。いくつかの実施形態において、処理1700は、ネットワーク接続型メモリ機器1306などのネットワーク接続型メモリによって実行される。いくつかの実施形態において、処理1700は、上述したようなキャッシュコヒーレンシプロトコルに従って実行される。処理は、ネットワーク接続型メモリでメッセージが受信される工程1702で始まる。メッセージは、ノード(例えば、タイダルポッド)上のページに関して実行される動作に基づいて受信される。いくつかの実施形態において、そのノードは、ネットワーク接続型メモリが通信する複数のノードに含まれる。いくつかの実施形態において、仮想マシンが、タイダルポッド内の各ノード上で動作する1セットのハイパーカーネルによって作成される。次いで、オペレーティングシステムが、複数の物理ノード上で集合的に実行されてよい。いくつかの実施形態において、(ゲスト)オペレーティングシステムは、透過的に動作される。例えば、上述のように、ハイパーカーネルを用いることにより、オペレーティングシステムは、(タイダルポッドにおけるように複数の物理ノード上で集合的に実行される際に)ベアメタルハードウェア上で動作している印象を与えられ、ここで、オペレーティングシステムへの修正がなされる必要はない。
上述のように、いくつかの実施形態において、ネットワーク接続型メモリは、物理的バイト配列として構造化される。いくつかの実施形態において、配列の各バイトは、仮想マシン内の物理メモリアドレスに対応する。
いくつかの実施形態において、ネットワーク接続型メモリは、集中型の機器である。別の実施形態において、ネットワーク接続型メモリは、タイダルポッド内のノードにわたって分散される。工程1704において、受信したメッセージに基づいて、ネットワーク接続型メモリによって動作が実行される。
上述のように、様々な実施形態において、ノード上のメモリのページに関して実行できる動作は、(ローカルまたはリモートであってよい)読み出しおよび書き込みを含む。実行される動作のタイプに基づいて、異なるタイプのメッセージが、送信されうる。
例えば、動作が、ページへの書き込み要求である場合、無効化要求(工程1702におけるメッセージの例)が、他のノードおよびネットワーク接続型メモリに送信されて、それらによって受信され、書き込まれるページのそれらのコピーが無効化される。ネットワーク接続型メモリは、次に、自身のページのコピーを無効化するよう構成されている。ネットワーク接続型メモリは、さらに、自身のページのコピーが今や無効であることを示す肯定応答を返すよう構成されている。次いで、書き込み動作は、無効化要求への肯定応答を受信した後に開始できる。
動作が、例えば、ページを読み出すためのノードからのリモート要求である場合、そのページ(例えば、ページのコピーまたはスナップショット、ここで、工程1702におけるメッセージは、そのページのコピーを含む)は、要求側ノードおよびネットワーク接続型メモリに送信される。次いで、ネットワーク接続型メモリは、ページのコピーで更新される(例えば、ネットワーク接続型メモリは、工程1704においてページのコピーを格納する)。
動作、アクション、および、ページ状態遷移の他の例については、表1と関連して上述した。
図18は、ページをゼロイングするための処理の一実施形態を示すフローチャートである。様々な実施形態において、処理1800は、タイダルポッドに含まれるノードおよび/またはネットワーク接続型メモリによって実行される。処理は、休止ページを割り当てる指示が受信される工程1802から始まる。いくつかの実施形態において、休止ページは、まだゼロイングされていないメモリのページである。様々な実施形態において、メモリのページは、(例えば、タイダルポッド内のノード上の)DRAM内のページ、フラッシュメモリ(例えば、ネットワーク接続型メモリ内の不揮発性メモリ)内のページ、または、任意の他の適切なメモリのページを含む。工程1804で、休止ページが割り当てられる。次に、工程1806において、割り当てられた休止ページがゼロイングされる。いくつかの実施形態において、休止ページのゼロイングは、休止ページの割り当てと並列で実行される。次いで、エントリが、第2レベルページテーブル内に配置され、ここで、ページは、有効かつ非休止になる。上述のように、(ページが休止としてタグ付けされうる)休止ページを用いることで、割り当て後に(または、割り当てと同時/並列に)ゼロイングを実行することにより、ゼロイングが起動時になされず、ページが用いられる時に「遅延して」行われるので、システムの起動速度が速くなる。
緊密に結合されたノードのクラスタにネットワーク接続型メモリ(例えば、フラッシュ機器)を取り付けるための技術(ここで、クラスタの総メモリが、強力なメモリコヒーレンシをサポートする仮想マシンのメモリを表す)について上述した。いくつかの実施形態において、上述のように、クラスタ内のネットワーク接続型メモリは、仮想マシンの参照メモリである。
上述の実施形態は、理解しやすいようにいくぶん詳しく説明されているが、本発明は、提供された詳細事項に限定されるものではない。本発明を実施する多くの代替方法が存在する。開示された実施形態は、例示であり、限定を意図するものではない。
[適用例1]コンピュータシステムであって、
複数の物理ノードを備え、オペレーティングシステムが、前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは、ネットワーク接続型メモリと通信するよう構成され、
前記複数の物理ノードに含まれる第1物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて、前記ネットワーク接続型メモリはメッセージを受信するよう構成され、
前記ネットワーク接続型メモリは、前記受信したメッセージに少なくとも部分的に基づいて、アクションを実行するよう構成されている、コンピュータシステム。
[適用例2]適用例1に記載のコンピュータシステムであって、前記ネットワーク接続型メモリの部分は、前記物理ノードの各々上で実行中の1セットのハイパーカーネルによって生成された仮想マシン内の物理メモリアドレスに対応する、コンピュータシステム。
[適用例3]適用例1に記載のコンピュータシステムであって、前記第1物理ノード上の前記ページに関して実行される前記動作は、前記ページへの書き込みを含む、コンピュータシステム。
[適用例4]適用例3に記載のコンピュータシステムであって、前記メッセージは、無効化要求を含む、コンピュータシステム。
[適用例5]適用例4に記載のコンピュータシステムであって、前記ネットワーク接続型メモリによって実行される前記アクションは、前記ネットワーク接続型メモリ上に格納されている前記ページのコピーを無効化することを含む、コンピュータシステム。
[適用例6]適用例5に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記無効化の完了を示唆する肯定応答を返すよう構成されている、コンピュータシステム。
[適用例7]適用例6に記載のコンピュータシステムであって、前記ページへの前記書き込みは、前記返された肯定応答に少なくとも部分的に基づいて実行される、コンピュータシステム。
[適用例8]適用例1に記載のコンピュータシステムであって、前記第1物理ノード上の前記ページに関して実行される前記動作は、前記ページの読み出し要求を含む、コンピュータシステム。
[適用例9]適用例8に記載のコンピュータシステムであって、前記ネットワーク接続型メモリによって実行される前記アクションは、前記ページのコピーを受信することを含む、コンピュータシステム。
[適用例10]適用例1に記載のコンピュータシステムであって、障害が検出された場合に、前記ネットワーク接続型メモリは、前記複数の中の前記物理ノードに1または複数のページのコピーを要求するよう構成されている、コンピュータシステム。
[適用例11]適用例10に記載のコンピュータシステムであって、コピーが要求された前記1または複数のページは、前記ネットワーク接続型メモリ上で無効であると判定されたページを含む、コンピュータシステム。
[適用例12]適用例11に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、要求したページの対応する取得されたコピーで無効なページを更新するよう構成されている、コンピュータシステム。
[適用例13]適用例1に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、集中型の機器を含む、コンピュータシステム。
[適用例14]適用例1に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記物理ノードの少なくとも一部にわたって分散されている、コンピュータシステム。
[適用例15]適用例1に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、フラッシュメモリ、相変化メモリ、および、3D−Xpointメモリの内の少なくとも1つを含む、コンピュータシステム。
[適用例16]適用例1に記載のコンピュータシステムであって、前記ネットワーク接続型メモリは、前記ページの読み出し専用コピーを格納するよう構成されている、コンピュータシステム。
[適用例17]方法であって、
ネットワーク接続型メモリでメッセージを受信し、前記メッセージは複数の物理ノード内の第1物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて受信され、
オペレーティングシステムが前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは前記ネットワーク接続型メモリと通信するよう構成され、
前記受信されたメッセージに少なくとも部分的に基づいてアクションを実行すること、
を備える、方法。
[適用例18]コンピュータプログラム製品であって、持続性のコンピュータ読み取り可能な記憶媒体内に具現化され、
ネットワーク接続型メモリでメッセージを受信するためのコンピュータ命令と、前記メッセージは複数の物理ノード内の第1物理ノード上のページに関して実行される動作に少なくとも部分的に基づいて受信され、
オペレーティングシステムが前記複数の物理ノードにわたって集合的に実行され、前記複数の物理ノードは、前記ネットワーク接続型メモリと通信するよう構成され、
前記受信されたメッセージに少なくとも部分的に基づいてアクションを実行するためのコンピュータ命令と、
を備える、コンピュータプログラム製品。
[適用例19]方法であって、
休止ページを割り当てるための指示を受信し、
1または複数のプロセッサを用いて、前記休止ページを割り当てることを備え、前記休止ページを割り当ては前記割り当てられた休止ページをゼロイングすることを含む、
方法。
[適用例20]適用例19に記載の方法であって、前記割り当てられたページに関連するエントリが、第2レベルページテーブル内に配置される、方法。