Skip to content

Linux 7.4のパッチ、テストでファイルオープンが39%高速に

43行のLinux 7.4向けパッチが、ファイルオープン時の余分なdentry(ディレクトリエントリ)参照を2つ削り、20コアのベンチマークを39%押し上げた。

著者 Tech AI Wire Team

3 分で読めます

サーバールームに並ぶ黒いサーバーラック。パッチパネルとケーブルが詰まり、床は二重床になっている。
写真: Carl Lender

数字で見る

more file opens per second in the test
39%
lines added across three files
43
CPU cores on the test machine
20
Same-file read-only opens per second, 20-core VM
Before the patch
4.04M
After the patch
5.63M

Linuxカーネルのバージョン7.4に向けて用意された小さなパッチが、作者のベンチマークでファイルオープンのスループットを39%引き上げた。Mateusz Guzik氏は2026年8月3日、2年以上にわたる改訂を経て、この変更をlinux-fsdevelメーリングリストに投稿した。ファイルを開く処理は忙しいサーバーが最も多く行う作業の1つであり、この高速化には引き換えの代償がない。そこに意味がある。

パッチの題名は「fs: avoid spurious dentry ref/unref cycle on open」だ。対象は仮想ファイルシステム、つまり個々のファイルシステムの上に位置し、openやreadといった要求を処理するカーネルの層である。

パッチが変えるもの

dentryとは、カーネルがキャッシュしているディレクトリエントリの記録だ。パス中の名前と、その名前が指すファイルとを結び付けている。カーネルは各dentryを自身のどれだけの部分が使っているかを数えており、その記録をいつ解放できるかを判断する。この数え上げが参照カウントである。

Guzik氏のコミットメッセージは、無駄をはっきり説明している。ファイルを開くと、まず__legitimize_path()で最終的なdentryの参照を取得する。次にdo_dentry_open()で2つ目の参照を取得する。そして最後にterminate_walk()で最初の参照を手放す。

この3つの操作のうち2つは何も達成していない。パッチはdo_dentry_open()に、新しい参照を取得して古いものを解放する代わりに、カーネルがすでに保持している参照をそのまま引き継がせる。

変更は小さい。バージョン5の差分は3つのファイル、fs/internal.hfs/namei.cfs/open.cにまたがって43行を追加し、4行を削除する。Guzik氏はこれを、このコードの長年のメンテナーであるAl Viro氏によるより大掛かりなパッチセットに対する、より単純な代案だと説明している。

参照カウントは単体で見れば安価に思える。しかし多数のCPUコアが同じカウンターに同時に触れるとき、それは安価ではない。更新のたびに他のすべてのコアから見える状態にする必要があり、コアは互いの後ろで順番待ちになる。

39%の根拠となったベンチマーク

この数値はwill-it-scaleによるものだ。これはカーネルの操作がコア数の増加にどれだけ耐えるかを測るテスト群である。Guzik氏は、同じファイルを読み取り専用で開いては閉じるループを回すopenro3.cのケースを使った。

20コアの仮想マシンでの結果は次のとおりである。

測定1秒あたりの操作数
パッチ適用前4,043,375
パッチ適用後5,629,378

これが39%という数字だ。2026年9月19日にこのパッチを報じたPhoronixは、変更がVFSのgitツリーのvfs-7.4.lookupブランチに入り、Linux 7.4のマージウィンドウを目指していると伝えている。

開発者にとっての意味

このベンチマークは、そのまま受け取ってはいけない。openro3のケースは、すべてのコアが共有された1つのファイルを読み取り専用で、密なループで開き続ける。これはこのパッチが触らなくなったまさにそのカウンターへの競合を最大化する。だから伸びがこれほど大きい。これは上限であって、あなたのワークロードに対する予測ではない。

実際の伸びは、処理時間のうちどれだけをファイルオープンに使っているか、そして同時に何コアがそれを行っているかで決まる。ベンチマークに近いワークロードは3つある。ビルドシステムは何千ものヘッダーをstatし、openする。ウェブサーバーはリクエストごとに同じ静的ファイルを開く。コンテナイメージやパッケージのツールは大きなディレクトリツリーを歩く。ノートPC上のシングルスレッドのスクリプトは、ほとんど何も得られないだろう。

カーネルの到着を待たずに、自分の影響度は測れる。代表的な実行についてstrace -cperfのプロファイルでopenとopenatのシステムコールを数え、全体の実行時間と比べればよい。プロファイル上でオープンが誤差の範囲なら、見出しが何と言おうと、このパッチはあなたのボトルネックではない。

時期を当てにした計画はまだ立てないこと。パッチはサブシステムのブランチに入った状態であり、そのメンテナーには受理されたが、メインラインのカーネルにはまだ統合されていない。Phoronixは2026年内に安定版カーネルへ届くことが期待されていると伝えている。マージウィンドウでその順序は変わりうるし、そのあとコードはディストリビューションのカーネルを経てあなたに届くため、通常はさらに数か月かかる。

より広い教訓のほうが役に立つ。これは数十年にわたり1日に何十億回も通ってきた経路への43行の変更であり、そこにはまだ冗長なアトミック操作が2つ残っていた。成熟したコードのホットパスは読み直す価値がある。カーネル自身の漸進的な改善の歴史も続いている。同じ7.4のサイクルでkbuildのパッチがカーネルのビルド時間を短縮した

出典

  1. [PATCH v5] fs: avoid spurious dentry ref/unref cycle on open - linux-fsdevel mailing list
  2. Simple Optimization For Linux 7.4 Can Open Files For Reading ~39% Faster - Phoronix

関連記事