見出し画像

複数のARMマシンを1つに集約するハードウェア仮想化レイヤ

飯田 圭祐(いいだ けいすけ)
柚山 大哉 (ゆやま だいや)

 ARMアーキテクチャは,低消費電力で高い性能を発揮し,スマートフォンやタブレット,組込みデバイスなどで広く採用されているが,Raspberry Piに代表されるような教育用や趣味に使われる小型コンピュータにも採用され,手軽に利用できるためのエコシステムが構築されている.

 このように手軽に手に入る価格性能比の高いコンピュータを複数組み合わせて,手軽に1つのコンピュータクラスタとしてユーザが利用できるプラットフォームを構築するのが本プロジェクトである.スケールアウトできるコンピュータクラスタは人類の1つの夢とも言え,過去から何度もチャレンジがなされてきたが,本プロジェクトの飯田さんと柚山さんがチャレンジした,x86やSparcなどの既存アーキテクチャではなく,ARMベースの安価なRaspberry Piをソフトウェアだけでクラスタリングさせようという試みは,非常に斬新である.

 実際,ハードウェアをそのままで,かつ既存のアプリケーションに手を入れずにクラスタ上で稼働させることは非常に困難であり,アーキテクチャへの理解度やプログラミング能力といった技術力だけでなく,どのCPUとメモリ空間にユーザプログラムを配置するかや,筐体を超えたメモリアクセスの保障,動的なスケールアウト・スケールインの手法など,アイディアとアルゴリズムの設計力も重要になってくるため,当初より実機で動かすという未踏性の高いプロジェクトであった.

 本プロジェクトでは複数の物理ARMマシンに跨って動作するハイパーバイザを実装する.実装されるハイパーバイザ上で動作するVMは,ゲストOSからは集約された1つの物理マシンとして認識され,その上で動作するアプリケーションはクラスタリング環境であることを意識することなくリソースにアクセスできるようにする.つまり,クラスタリング環境上で既存のOS・アプリケーションがそのまま動作するようにする.具体的には,クラスタのノードとしてRaspberry Pi 4とGigabit Ethernetで構成されるクラスタに跨って動作するハイパーバイザを実装し,ゲストOSとしてLinuxを想定した上で,クラスタ上の資源を集約した単一のシステムイメージを提供するため,以下の5つを目標とした.

  1. 複数のノード上に実装したハイパーバイザ上でゲストOSが動く.

  2. ゲストOSが集約されたCPUとRAMを認識して透過的にアクセスができる.

  3. ゲストOS上で動くマルチスレッドアプリケーションが本システムで動く.

  4. 本システムでスケールするアプリケーションとスケールしないアプリケーションを示す.

  5. 実行中にノードが追加されたときにゲストOSが増えたCPUとRAMを認識できる.

 比較対象のプロジェクトとして,MOSIXやKerrighedなどが挙げられる.これらのプロジェクトは,Linuxを分散OSに改造してクラスタ上の資源を集約した単一のシステムイメージを提供していた.しかし,Linuxでしか動作しない,Linuxの書き換えが必要,Linuxのアップデートに追従する必要があるという問題があった.

 また,vNUMAやVirtual Multiprocessor,GiantVM,vSMPなどは,それぞれ特定のハードウェアに対応した実装となっており,改変が必要な場合があったり,メモリの集約が行われなかったり,ホストOSのオーバヘッドがかかるなどの欠点があった.

 これに対して,本プロジェクトでは,ARMアーキテクチャ向けに実装されたPilevisorを提供することで,既存のエコシステムを利用しながらクラスタ上の資源を効率的に活用することを目指した.

 ハイパーバイザは,主に飯田さんが担当し,C言語とARMアセンブリ言語を使用してフルスクラッチで実装した.また,デバイスドライバ,ノード間通信プロトコルスタック,CPU集約機構,仮想電源コントローラ,仮想割り込みコントローラ,メモリ集約機構,IOフォワーディング,ノード間のクロック同期など,さまざまな機能を実装した.

 ARMv8には,CPUの特権レベルとしてException Level(EL)が存在し,0〜3の4レベルに分かれている.EL0から数字が上がるにつれて権限が強くなって,アクセス可能なレジスタがより増えていき,各ELで実行するソフトウェアの種類は,以下の通りである.

  • EL ソフトウェア種別

  • EL0 ユーザモードのソフトウェア

  • EL1 カーネルモードのソフトウェア

  • EL2 ハイパーバイザ

  • EL3 トラストゾーン

 本プロジェクトでは,ARMv8アーキテクチャ向けにEL2上に構築されたハイパーバイザの実装を行った.このハイパーバイザは,ゲストOSが必要な場合にのみトラップして動作するため,演算命令など,ハイパーバイザの介入が必要のない場合は何も処理を行わずに済む.ハイパーバイザの介入が必要な場合には,ARMv8の仮想化支援機構を利用して高速にトラップを行い,ハイパーバイザの処理を行うことができる.

 EL2はEL1よりも強い権限を持っており,EL2で実行されるハイパーバイザは,EL1で稼働するホストOSの保護を行うことができる.また,EL2はEL1の割り込みをトラップすることができ,EL2からホストOSに割り込みを転送することができる.この機能を利用することで,ハイパーバイザはゲストOSが発生させた割り込みをトラップし,必要に応じてホストOSに割り込みを転送することで,ゲストOSとホストOSの間で割り込みを共有することができる.

 ハイパーバイザは薄いハイパーバイザであり,単一の仮想マシンのみをサポートする.この薄いハイパーバイザの実装により,仮想化によるオーバヘッドを最小限に抑えることができる.

 メモリアクセスについては,自ノードへのメモリアクセスと他ノードへのメモリアクセスを区別するために,2段階ページ変換を使用している.これは,ゲスト空間から見た物理アドレスと実際の物理アドレスの変換を透過的に行う仮想化支援機構の1つである.ARMでは,Stage 2 Page Translationと呼ばれる.2段階変換ページテーブルを使用して,仮想共有メモリの実装を行っている.このページテーブルは,ページサイズ(4,096バイト)単位でマッピングを行い,他ノードから受け取ったメモリページをキャッシュする.また,メモリのownerを追跡し,キャッシュ一貫性制御を保つ仮想共有メモリマネージャを実装している.

 ノード間通信は,飯田さんとともに柚山さんが実装した.Ethernetを介してノード間でメッセージを伝える必要があり,そのためにノード間通信プロトコルを制定し,プロトコルスタックの実装を行った.送信メッセージのサイズが最大4,160バイトで,Ethernetフレームのデフォルト上限サイズである1,536バイトを超えるため,ジャンボフレームを使用することにした.メッセージは17種類あり,それぞれ異なる目的を持っている.ペイロードにEthernetヘッダを付ける方法については,Pilevisorではポインタ演算と最小限のコピーのみでヘッダの追加・削除ができるデータ構造を実装しており,処理のオーバヘッドを最小限に抑えている.

 各ノードが起動したときは,自分以外のノードが誰なのか,自分はどこのノード担当なのか分かる術を持っていない.そのため,最初に認識のための通信を行って,各ノードがクラスタの状態を知る必要がある.ノード認識は,6つのステップで行われる.最初に,メインノードがLAN内にいる全員に発見ブロードキャストを行い,その後,サブノードが応答して各種情報を送信する.その情報を元に,クラスタ情報を構築し,全ノードにブロードキャストする.その後,各ノードはクラスタ情報を元に初期化を行い,初期化終了通知をメインノードに送信する.メインノードは,全ノードからsetup doneが返ってくるまで待ち,前準備が行ったら,boot sigメッセージをブロードキャストする.最後に,sigを受け取ったノードは,割り込みコントローラの機能を使用して,ゲストOSに仮想割り込みを注入する.また,物理CPUのCPU番号はノードごとに0から割り当てられているため,仮想マシンが直接物理CPUのCPU番号を直接参照すると,矛盾が生じる.そのため,ノード間認識通信のときに決定された仮想CPU番号を仮想マシンに見せるようにする必要があり,ARMv8の仮想化支援機構を使用した.

 これらの実装により,ARMマシンのクラスタの資源を仮想化技術によって集約し,単一の仮想マシン上で複数のオペレーティングシステムが同時に動作することを可能にし,複数のマシンを組み合わせて,効率的にリソースを利用することができるようになった.

 なおクリエータたち自身は,これまで「車輪の再発明」しかしてこなかったと述べており,実際に既存の実装を改良することでさまざまな開発を行なってきたようであるが,今回のプロジェクトにおいては先行の事例がきわめて少ない中で,試行錯誤をしながらさまざまな新しい実装を進めてきたことが素晴らしい.

 実際にプロジェクトの途中では実装が進まない時期もあり,かつ情緒面でも心配されることがあったり,実装が危ぶまれたりしたこともあったが,典型的な追い込み型で成果報告会の発表直前に実機稼働を成し遂げるという,ヒヤヒヤしながらも結果の出せるプロジェクトになった.

 これらの成果物はオープンソースで公開しており,ほかの研究者や開発者がこれを利用して,より高度な仮想化技術を実現することができるようになる.これにより,ARMマシンを用いたさまざまなアプリケーションやシステムの開発が促進され,より効率的かつスケーラブルなシステムの構築が可能になることが期待される.

(担当PM・執筆:田中邦裕)

[統括PM追記] 田中PMが非常に詳細な実装内容を記述されていて,図がなくても実際にどんなことを2人がしたかが手に取るように分かる.当人たちは「すべて車輪の再発明」と謙遜しているが,そういったものを積み上げて,これまでになかったシステムを作り上げることもまた未踏の醍醐味である.成果報告会の前日にシステムが動いたという綱渡りだったので,これがどのような問題に対してスケールするのかしないのかはぜひ確かめて,普及させてほしい.

(2023年7月3日受付)
(2023年9月15日note公開)