Btrfs、Linux 7.3でDirect I/O性能が実質2倍に。3〜5倍の改善も複数

Btrfsメンテナーのシュテルバ氏がLinux 7.3マージウィンドウ向けの更新を送付した。Direct I/Oの性能が理論最大値の95%まで引き上げられたほか、ログコミットやfsyncで3倍〜5倍の改善が入っている。

Btrfs、Linux 7.3でDirect I/O性能が実質2倍に。3〜5倍の改善も複数

Btrfsメンテナーのシュテルバ氏がLinux 7.3マージウィンドウ向けの更新を送付した。Direct I/Oの性能が理論最大値の95%まで引き上げられたほか、ログコミットやfsyncで3倍〜5倍の改善が入っている。


Direct I/Oの性能が理論最大値の95%に

8月16日にLinux 7.2がリリースされ、翌日からLinux 7.3のマージウィンドウが開いた。SUSEのダヴィド・シュテルバ(David Sterba)氏は現地時間8月19日、Btrfsファイルシステムの更新をリーナス・トーバルズ氏に送付した。

今回最も大きな改善はDirect I/O(カーネルのページキャッシュを経由せず、ストレージと直接データをやり取りする方式)の性能回復だ。

Btrfsは従来、Direct I/Oの処理中にデータの正確性を保つため、バッファードI/O(カーネルのメモリを経由する方式)にフォールバックしていた。安全だが遅い。この方式では理論最大値の約50%しか出ていなかった

Linux 7.3ではiomap(カーネル共通のI/Oマッピング基盤)のbounce buffer(一時的なメモリ領域を介してデータを中継する仕組み)を使うよう変更された。これにより、正確性を保ちつつ理論最大値の約95%まで性能が回復した。事実上の2倍だ。

Btrfsは7.2でもDirect I/O書き込みの性能修正が入っていた。2023年のマウントAPI移行時にフラグが誤って外れ、同一ファイルへの書き込みが2年以上にわたって直列化されていた問題の修正だ。7.3のiomap対応は、その延長線上にある改善といえる。

ログとfsyncで3倍〜5倍の高速化

Direct I/O以外にも、複数の箇所で大幅な性能改善が入った。

まず、内部のデータ構造であるXArray(拡張可能な配列)をローカルLRUリスト(最近使われたものを優先する仕組み)に置き換えた変更がある。抑制されたextent buffer(ファイルシステムのメタデータを保持するメモリ領域)の追跡に使われていたXArrayが性能低下の原因になっていた。置き換えにより、性能は抑制導入前の状態に回復した。相対的に約3倍の改善になる。

次に、非SSDモードでのログコミット処理の改善だ。複数のロギングタスクが動いているとき、Btrfsは1 jiffy(カーネルのタイマー刻み、通常1〜4ミリ秒)の遅延を挟んでいた。プルリクエストによれば、この遅延に技術的な必然性はなかった。除去した結果、レイテンシが低下し、サンプルワークロードでスループットが約5倍に向上した。

fsync(ファイルの変更をストレージに確実に書き込む処理)にも改善が入った。ホールのないファイルで多数のエクステント(データの連続領域)を持つ場合、フルfsync時にホール検出を実行していた。ホールがなければ検出は不要だ。この判定を追加したことで、サンプルワークロードの実行時間が約5倍短縮された。マイクロ秒の範囲での改善だが、大量のファイルを扱う環境では積算の影響が大きい。

さらに、extent readahead(先読み)周りのロック範囲を縮小し、重複範囲を使う他のタスクが減速しない改善や、extent bufferのアロケーションにNOWAIT(ブロックせずに即座に返す)を一部で許可する変更も含まれている。

Linux 7.3 Btrfs性能改善の倍率
※サンプルワークロードでの測定値。Direct I/Oは理論最大値に対する回復率(50%→95%)を倍率換算

古い空き領域管理が標準で無効に

性能だけでなく、ユーザーに影響する整理も進んだ。

Btrfsのfree space(空き領域管理)にはv1とv2がある。v2はfree space treeと呼ばれ、B-treeで空き領域を管理する方式だ。mkfs.btrfs(フォーマットツール)の標準設定としてはバージョン5.15からv2が採用されている。

Linux 7.3では、v1が標準で無効化された。v1でフォーマットされたファイルシステムは引き続き動作するが、ブロックグループのキャッシングが行われないため、若干遅くなる可能性がある。

v1からv2への移行は、アンマウント後にbtrfs check --clear-space-cache v1でv1キャッシュをクリアし、mount -o space_cache=v2で再マウントすれば完了する。大容量のファイルシステムでは初回マウントに時間がかかる場合がある。

あわせて、5.9で非推奨になっていたスタンドアロンのusebackuprootマウントオプションが削除された。代わりにrescue=usebackuprootを使う。このオプション自体もリードオンリーマウントが必須になり、書き込み可能な状態での使用はリスクが高いとして禁止された。

ページサイズより小さいブロックサイズを許可する際の4KiB制限も撤廃されている。

バグ修正と内部改善

修正も多い。writeback(書き込みの遅延処理)中にfolio(カーネルのメモリ管理単位)を書き込み保護する修正は、mmap(メモリマップドI/O)との同時アクセスで圧縮やチェックサムの計算が不正な結果を返す問題に対処したものだ。

zonedモード(SMR/ZNSドライブ向けの書き込み制御)では、一時的な容量超過をエラーではなくリトライで処理するよう変更され、不要なリードオンリー遷移を防ぐ。デフラグとdelayed allocation(遅延割り当て)の間で発生しうるデッドロックも修正された。

RAID56の退化デバイスカウントモード(2台または3台構成)がパリティ計算ライブラリで正しく処理されない問題には回避策が追加された。Btrfsはこのモードの構成をRAID1/RAID1C3として扱うことで対処している。

サブボリュームがリードオンリーのときにACL(アクセス制御リスト)の変更を拒否するチェックが復元されたほか、verity(ファイル単位の整合性検証機能)データの読み取りでステータス変更と衝突した場合のリトライ処理も追加された。

全体で42ファイルが変更され、1,437行が追加、978行が削除された。シュテルバ氏自身は今回を通常より小規模な夏版と位置づけている。コミット数ではチュー・ウェンルオ(Qu Wenruo)氏の31件が最多で、フィリペ・マナナ(Filipe Manana)氏が18件で続く。

Btrfsは7.0、7.1、7.2と、リリースごとに性能改善を続けてきた。7.3で実ユーザーのPCに届く時期は、各ディストリビューションがこのカーネルを採用するタイミングで決まる。最終リリースは2026年10月中旬〜後半の見込みだ。

関連記事

この記事を共有する

Read more