酒呑ガジェット

〜静かな環境であなたに...こちらは音のでないコンテンツです。〜

【朗報】OSのアップデートだけで2倍高速化 Linux 7.2の新スケジューラが「キャッシュを理解」し始めた

【朗報】OSのアップデートだけで2倍高速化 Linux 7.2の新スケジューラが「キャッシュを理解」し始めた

高価なCPUを買い替えなくても、OSの仕組み次第でパソコンはもっと速くなる。Linux 7.2で導入された「キャッシュを理解するCPUスケジューラ」は、まさにその好例だ。どの作業をどのCPUコアに割り当てるかを決める「交通整理」の仕組みを根底から見直し、手動のチューニングなしで劇的な性能向上を実現している。最新の多コアCPUが本来持っているポテンシャルを、ようやくOS側が引き出せるようになったのである。

複数のCPUコアがキャッシュメモリを介して接続され、データが効率よく流れるスケジューリングの概念図

なぜ「コアが増えても遅い」ことがあったのか

昔のCPUは1枚のチップで全てを作っていたが、微細化の限界から、今は複数の小さなチップをつなぐ「マルチダイ(チップレット)」設計が主流になった。AMDのZenアーキテクチャやIntelのSapphire Rapidsなどが代表例だ。コア数は劇的に増えたが、新たな問題が生まれた。

それが「キャッシュメモリの構造の複雑化」だ。1つの大きなダイなら全コアで同じキャッシュを共有しやすかったが、マルチダイでは別のダイのキャッシュへアクセスするのに「インターコネクト」という通路を通る必要がある。この別ダイへのアクセスは、同じ場所のキャッシュへのアクセスと比べて待ち時間が数十倍から数百倍にも跳ね上がる。

従来のLinuxスケジューラは、CPUコア全体の負荷を均等にすることばかりを重視していた。そのため、空いているコアがあれば、たとえ遠く離れた別ダイのコアであっても無差別に作業を割り振ってしまっていた。せっかく計算しようとしても、遠くのダイまでデータを取りに行く待ち時間が長くなり、CPUの稼働率は100%に見えていても実際はキャッシュの無効化やメインメモリからの読み込み待ちばかりになる。この現象を「メモリウォール(あるいはパイプラインスタール)」と呼ぶ。

「キャッシュ・アウェア・スケジューリング」の正体

Linux 7.2で新たに導入された仕組みは、コアへの単純な負荷分散と、データの局所性(どこにデータがあるか)のバランスを根本から見直したものだ。具体的には、1つのプログラムの中で動いている複数の作業まとまりを「スレッド」と呼ぶが、新しいスケジューラは同じプログラムに属するスレッド群を、同一のLLC(ラストレベルキャッシュ)=メインダイ内に自動的に集約して実行させる。

同じ部屋に作業員を集めるようなもので、スレッド同士が同じLLC内にいればデータの共有が非常にスムーズになる。結果として、複数のCPU間でキャッシュの所有権が激しく移動してしまう「キャッシュバウンシング」という現象を大幅に減らせ、キャッシュミスも減るためメモリに取りに行く無駄な時間を削減できる。

開発陣が経験した「大失敗」

この機能を完成させるまでには、開発者たちも大きな失敗を経験している。初期の試作版では、タスクがスリープ状態から復帰する瞬間に即座に最適なキャッシュドメインへ移動させる設計だった。一見合理的に見えたが、目覚めた瞬間の情報は最新の負荷状況を反映しておらず、特定のLLCにタスクが過剰に集中してしまった。

すると従来の負荷分散ロジックが「ここだけ込みすぎ」と判断し、別の空いているLLCへ引き戻そうと働き始めた。2つの異なる仕組みが相反する方向にタスクを引っ張り合い、結果として激しく揺さぶられる「マイグレーションバウンシング」という深刻な性能低下を引き起こしたのだ。最適化しようとして、移動のせいで逆に遅延が悪化してしまった。

7.2に搭載されたバージョン4の実装ではアプローチを大きく変更し、即座に移動させるのではなく、システム全体の負荷状況を正確に俯瞰できるロードバランシングのタイミングに限定して、保守的に移動の判断を行うようにした。これにより安全かつ効果的にキャッシュのまとまりを維持できるようになった。

どのスレッドがデータを共有しているかの判断

スケジューラは、カーネル内のメモリ管理構造(MMストラクト)を拡張して判断する。同じプログラムから生まれたスレッドたちは、共通の仮想メモリ=このMMストラクトを共有している。スケジューラはこの前提を利用し、同じMMストラクトを持つスレッド群はデータを共有している確率が高いと推測する。

さらに、各CPUコアでどれだけ実行されたかという実行時間履歴を秒単位で記憶し、過去数十ミリ秒より前の古い履歴データは指数関数的に重みを減らしていくアルゴリズムを採用。プログラムの動作フェーズが変わっても遅れることなく動的に追従する、非常に賢いメカニズムだ。

「詰め込みすぎ」を防ぐガードレール

特定のLLCにばかりタスクを集めすぎると、CPU資源が枯渇してかえって遅くなる。そこで7.2のスケジューラは厳格な過負荷防止のガードレールを持つ。対象プロセスが移動先のLLCドメイン内で25%以上のCPU時間を消費している場合、あるいはドメイン全体の負荷の33%以上を占めている場合、それ以上の集約を強制的に停止する。従来の「均等にする」性質と「キャッシュに集める」性質がぶつかって暴走しないための強力な安全弁だ。

また、管理者はワークロードの特性に合わせてレバーを微調整できる。例えば「LLC集約許容度」というパラメーターで、タスクを集約させる積極性を0〜100の間で制御可能だ。HPC(スーパーコンピューター向けの巨大なデータ処理)のように共有データへのアクセスよりメモリ帯域自体が優先される場合は、プロセスの物理メモリ使用量(RSS)を推定し、LLCサイズを超えた場合はキャッシュ集約を自動的に無効化するインテリジェントな機能も働く。

実証された性能向上

理論だけでなく、実運用環境での結果が報告されている。データベースなどのサーバー向けアプリケーションでは、MongoDBを使ったベンチマークでスループットが29.4%向上、平均レイテンシが22.8%削減されたことが公式記録に残っている。リスクプロセッサーの開発で使われるシミュレーターの検証でも、AMDのEPYCプロセッサ上での実行において処理時間が半減、つまり2.03倍の高速化を達成した。かつて管理者が手動でコア割り当てを固定していたツールが不要になったと絶賛されている。

AIや機械学習の推論ジョブでも効果が期待されており、L3キャッシュ内でデータを再利用できる点は非常に重要だ。

ネットの反応

今回のCASは速くなる改善ではなくて遅くなりにくくなる改善です。Intelの個人向けCPUを使っている人には全く意味がないことも重要です。Xeonを使っているなら別ですが。

AIの所感

ハードウェアが異世代進化したかのような恩恵を、ソフトウェアの最適化だけで得られるのは面白い。特に「データの近くで実行すること」へとOSの哲学が次元を上げた点は歴史的な転換だ。ただ、コメントにもある通り、この恩恵を最も受けるのはサーバー向けのXeonやEPYCのような多ダイ構成であり、一般のデスクトップ向けCPUでは効果が限定的な場合もある。それでも、チップレット化が極限まで進むこれからの時代において、このスケジューラはクラウド基盤全体を支える重要な土台になっていくはずだ。

-パソコン