CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
今回からは、2025年に公開された論文「Wave: Offloading Resource Management to SmartNIC Cores」に基づいて、タスクスケジューラやメモリ管理の処理など、OSの管理タスクをSmartNICのCPUコアにオフロードするアーキテクチャー「Wave」について解説します。今回は、Waveを理解する前提となるSmartNICの基本的な仕組み、そして、Googleのデータセンターで利用されているプラグイン型のタスクスケジューラ「ghOSt」との関係を説明します。
サーバーに搭載されたNIC(Network Interface Card)は、ネットワークパケットの送受信を行うハードウェアデバイスです。旧来のNICは、外部ネットワークから受け取ったパケットをサーバーのメモリーに書き込んでそれを処理するCPUを割り当てる、あるいは、その逆の処理を行うことが主要な役割でしたが、その後、データ圧縮や暗号化処理など、追加の機能をASICで実装するようになりました。そして現在、Googleのデータセンターのような大規模なコンピューティングインフラでは、ARMコアのような汎用のCPUと、このCPU専用のメモリーが搭載されたSmartNICが使用されています。これは、ネットワーク仮想化やファイアウォールなど、ネットワークに関連したソフトウェア処理をNIC上のCPUにオフロードするために利用されています。
そして、SmartNICに搭載されたCPUは、サーバーに搭載されたCPUと同等の汎用的なCPUですので、原理的には、ネットワークに関係しない処理を実施することも可能です。冒頭の論文では、そのような利用方法の例として、「タスクスケジューラ」「メモリ管理(メモリページの割り当てや階層間のデータ移動)」「Stubby(gRPCのGoogle社内実装版)のプロトコル処理」などをSmartNICで実施するアーキテクチャー「Wave」が解説されており、これらをSmartNICで実施するメリットやこれを実現する際の課題などが説明されています。
SmartNICで実行する処理の例の1つにタスクスケジューラがありますが、これは、もともとGoogleのデータセンターで利用されていた「ghOSt」のアーキテクチャーと深い関わりがあります。ghOStについては、『第117回 ユーザースペースのプラグイン型タスクスケジューラ「ghOSt」(パート1)』から始まる一連の記事で紹介していますが、ここでは、主要なポイントをまとめて説明します。
タスクスケジューラの役割は、それぞれのCPUコアに対して、次に実行するべきスレッド(プロセス)を選択することですが、システム全体のスループットと個々のスレッドの応答速度のどちらを優先するかなどでさまざまなポリシーの選択やチューニング対象のパラメーターがあります。Googleのデータセンターでは、さまざまなタイプのワークロードに柔軟に対応するために、Linuxカーネルが標準で持っているタスクスケジューラではなく、独自に実装したタスクスケジューラをユーザー空間で動かす仕組みである「ghOSt」を利用しています。
ghOStのアーキテクチャーは、図1のようになっており、Linuxカーネルが次に実行するスレッドを選択する際は、専用に設計されたAPIを利用して、ユーザー空間で稼働する「ghOStエージェント」に処理を依頼します。ghOStエージェントを入れ替えることで、さまざまなタイプのタスクスケジューラが使用できます。

図1 ghOStのアーキテクチャー概要(ghOStの論文より抜粋)
このghOStエージェントをSmartNIC上で稼働させようというのが、Waveの基本的なアイデアです。図2は、Waveのアーキテクチャーの概要ですが、図1の「ghOSt agents」の部分が「User space」から「SmartNIC CPU」に移動していることがわかります。また、SmartNICで稼働するエージェントの種類を入れ替えることで、タスクスケジューラ以外の処理にも対応します。

図2 Waveのアーキテクチャー概要(論文より抜粋)
WaveのエージェントはSmartNICのCPUで稼働するので、ホストCPUで稼働するLinuxカーネルとは、SmartNICを接続するPCIeのインターフェースで通信します。それぞれのエージェントについて、データや命令を受け取るためのキューが用意されており、Linuxカーネルは、適切なキューにメッセージを送ります。エージェントが必要な処理を完了すると、PCIe標準のMSI-Xを用いて、CPUコアに割り込みメッセージを送信します。
この他には、Waveのエージェントから、Linuxカーネルに対してトランザクションを発行する機能も用意されています。たとえば、タスクスケジューラのエージェントが「次に実行するスレッド」を決定した後、実際にスレッドの切り替え処理を行う際は、エージェントからLinuxカーネルに対して「スレッドの切り替えを実行するトランザクション」を発行します。遅延の大きいPCIeをまたいで通信するため、エージェントが決定を下した直後にホスト側で対象のスレッドが終了してしまうなどの「すれ違い」が発生する可能性がありますが、トランザクションを用いることで、そのような競合が起きても安全に決定を適用(コミット)、もしくは、破棄(ロールバック)することが保証されます。
今回は、2025年に公開された論文「Wave: Offloading Resource Management to SmartNIC Cores」に基づいて、OSの管理タスクをSmartNICのCPUコアにオフロードするアーキテクチャー「Wave」に関連して、SmartNIC、ghOStなどの技術、そして、WaveのAPI仕様を説明しました。次回は、Waveのより詳細な仕組みを解説します。
Disclaimer:この記事は個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には関係はありません。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes