数十年にわたって修正が加えられ、乱雑さという垢が蓄積されたコードをきれいにするというのは気の弱い人がやる作業ではない。しかし、Linuxのカーネル開発における第一人者であるIngo Molnar氏は自らの持てる力を最大限に傾け、オープンソースのLinuxカーネルに秩序を取り戻そうとしている。
Linuxのソースコードは2020年に2780万行に達した。それ以降もその規模は増大する一方だ。Linuxは、30年が経過している他のソフトウェアプロジェクトと同様に、その長い歴史の中でソースコード中にかなりの量の垢をため込んでいる。Linuxカーネルの上級開発者であるMolnar氏はこの問題を根本的なレベルで解決するための初撃となる数カ月におよぶ作業の成果として、「Fast Kernel Headers」(カーネルヘッダー高速化)プロジェクトをリリースした。
その狙いは何だろうか。答えは、Linuxカーネルのヘッダー階層と、ヘッダーの依存関係を全体的に整理し、作り直すということに他ならない。Linuxには多くのヘッダー、すなわち.hファイルが存在している。厳密に述べるとLinuxカーネルのinclude/とarch/*/include/というファイル階層内におよそ1万の主要な.hヘッダーが存在している。Molnar氏は「過去30年強でこれらヘッダーは膨れ上がり、われわれが愛情を込めて『依存関係地獄』と呼んでいる、複雑で痛みを伴う相互依存性のかたまりになった」と説明した。
こういった状況の中、Molnar氏は2200におよぶコード修正のコミットを提案している。これは大量のコミットだ!なぜこれほどまでに多いのだろうか。同氏によると、この整理整頓プロジェクトを立ち上げた2020年末には、これほど多くの混乱がコードに潜んでいるとは気付いていなかったのだという。同氏は次のように記している。
- このプロジェクトを開始した2020年末の時点では、おそらく50〜100程度のパッチになるだろうと考えていた。そして大まかな測定を実施してみたところ、ヘッダーの依存性を低減させることで、カーネルのランタイムに大きな影響を与えずに、ビルドの速度をおよそ20%高速化できるという見込みが出てきた。この値は、50〜100のコミットを正当化するだけの十分な説得力があると感じられた。
- しかし、パッチの数が増えても、パフォーマンスはあまり向上しなかった。また、2021年の半ばまでに、このツリーは500を超えるコミットにまで膨れ上がり、2度目の取り組みも捨てざるを得なかった(!)。最初の2度のアプローチはスケーラビリティーがなく、メンテナンス性も悪く、ビルドの速度向上もわずか4%程度だったため、500のパッチに対する作業を続ける価値はなく、公に発表する意味すらなかった。
- 3度目の取り組みで私は、per_task()という仕掛けを導入した。これによって依存性を劇的に引き下げる上で必要となる柔軟性を確保できた。またこれはメンテナンス性を向上させるタイプ(型)クリーンなアプローチだった。しかし、コミット数が1000を超えてもビルド速度の向上はせいぜい10%だった。このため、私はこれもアップストリームにプッシュしてもよいとは感じず、発表する気にもならなかった。 :-/
- しかしこの値から、20%のパフォーマンス向上は十分可能だという手応えを感じた。このため私は、このツリーでの作業を続けた。すると、コミット数が1500を超えた2021年秋あたりから目に見えて速度が向上し始めた。そして速度向上が20%を超え、現在の参照設定では78%に達するという、まさに驚くべき成果が達成された。依存関係の数を最小限にまで減らすことで、カーネルビルド時のオーバーヘッドは明らかに線形を超えて改善されるのだ。