Linuxカーネルは現在、10月中旬(10/18または10/24)に予定されている「Linux 7.3」の正式リリースに向けてリリース候補版(RC)を重ねているが、その次のバージョンである「Linux 7.4」に向けた新しい機能も着々と準備が進んでいる。IBMが開発した仮想化関係向けのスケジューラ機構である「Steal Governor」もそのひとつで、9月28日付けでLinuxカーネルのtipツリー(tip/tip.git)にキューイングされており、Linux 7.4のマージウィンドウに提出される見込みだ。
Steal Governorを端的に表現すると「仮想CPU(vCPU)がハイパーバイザに奪われている(steal)とき、あえて使用するvCPUを減らすスケジューラ機構(governor) 」といえる。
マルチコア環境で複数のvCPUが協調して動いている場合、ロックを保持しているvCPUがハイパーバイザによって奪われてしまう(プリエンプトされる)と、単にそのvCPUの作業時間を失うだけでなく、ほかのvCPUの処理にも影響が出ることが多い。たとえばOLTP/OLAPが混在するデータベースワークロードなどはロックやスレッド間の依存関係が多い。このためCPUの競合によるプリエンプションの影響を受けやすく、システム全体のパフォーマンス低下がボトルネックとなっていた。
これを解決するためにIBMがPowerプロセッサ向けに開発してきたのがSteal Goverorで、ハイパーバイザによって奪われているCPU時間(steal time)が長いと判断すると、スケジューラはあえて作業するCPU(Preferred CPU)の数を動的に減らす。ゲストOSが優先的に使うvCPUの数そのものを減らすことで、vCPUどうしの待ち合わせや競合を減らすという考え方だ。もともとはIBM Power上の仮想化環境を念頭において開発されたものだが、コミュニティ内でのフィードバックを繰り返したことで、x86やs390(IBM S/390)でのパフォーマンス向上にも効果があることが確認されている。
パッチを投稿したIBM所属のエンジニアであるShrikanth Hegdeは「この機能(Steal Governor)はすべてのVMが協調的に動作する場合にもっとも効果を発揮する。明示的なモジュール読み込みを必須とすることで、システム管理者が意図的にすべてのVMに本機能を展開することを確実にする」とコメントしているが、実際にはSteal GovernorはそれぞれのVMが自身のsteal timeをチェックし、それに応じてPreferred CPUの数を調整するしくみであり、他のVMと直接通信するわけではない。また、前述したようにSteal Governorが効果を発揮するのは大規模なデータベースワークロードやクリティカルセクションなど、vCPUを途中で奪われることで他のvCPUの処理が中断するといった二次的な損失が大きいワークロードであり、単純にCPU時間を消費するタイプのワークロードでは「わずかにリグレッションが発生する(性能が落ちる)可能性がある」(Hegde)という。
Linux 7.2で導入されたキャッシュ認識スケジューリング(CAS)も、CPUを単純に均等配分するのではなく、キャッシュというハードウェアの特性まで考慮してタスクを配置するしくみだった。Steal Governorも同様に、仮想化環境では「割り当てられたvCPU数=実際に利用できるCPU性能」ではないという現実をスケジューラに取り込もうとしている。
Linuxのスケジューラは「CPUを公平に配る」だけではなく、キャッシュや仮想化といった実際の実行環境を考慮しながら、タスクをできるだけ効率よく前に進める方向へ進化している。Steal Governorは、その流れを象徴する機能のひとつといえるだろう。