# ファイルシステムキャッシュ階層
## 定義
ファイルシステムキャッシュ階層とは、ディスクI/Oのレイテンシからアプリケーションを隔離するためにOSが用いる複数種のメインメモリキャッシュの集合である。Linuxではページキャッシュ(仮想メモリページ単位、1985年にSunOSが導入)・バッファキャッシュ(ディスクブロック単位、Linux 2.4以降はページキャッシュ内に格納されダブルキャッシングを回避、UBC: Unified Buffer Cacheと呼ばれる方式)・ディレクトリキャッシュ(dentryキャッシュ/Dcache、ディレクトリエントリからVFSiノードへのマッピングをハッシュテーブルで保持しRCU-walkで高速化)・iノードキャッシュ(VFSiノードのメタデータを保持)の4層が使い分けられる。ZFSはこれに加えてARC(プライマリキャッシュ、MRU/MFUを併用する適応型置換キャッシュ)・L2ARC(セカンダリキャッシュ、フラッシュメモリ上)という独自のキャッシュ体系を持つ。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.3.2, §8.4.3)
## ダーティページのライトバック
ページキャッシュ内のダーティ(書き換えられた)ページは、(1) 30秒の経過、(2) sync(2)/fsync(2)/msync(2)呼び出し、(3) dirty_ratio/dirty_bytesパラメータの超過、(4) 空きページの枯渇、のいずれかでディスクにフラッシュされる。Linux 2.6.32以前は固定数(2〜8個)のpdflushスレッドプールが担っていたが、それ以降はデバイスごとのフラッシャースレッド(flush)に置き換えられ、デバイス間のワークロードバランスとスループットが改善された。メモリが不足するとページアウトデーモン(kswapd、ページスキャナ)がダーティページの書き込みをスケジューリングして回収する。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.4.3.2)
## 横断的知見
- 本概念に触れたソースは現時点で1件([[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]])のため、複数ソース突き合わせによる知見の蓄積は今後の ingest に委ねる。関連概念 [[ページキャッシュカスタマイズ]] はLinuxのページキャッシュのLRU近似アルゴリズム(active/inactive FIFOリスト)を出発点にeBPFでの退避方針カスタマイズを論じており、本概念が示す「ダーティページのライトバック契機(時間・システムコール・dirty閾値・空きページ枯渇)」という基本モデルと同じ対象を異なる角度(観測的解説 対 拡張可能カーネル研究)から扱っている。両ページを合わせて読むことで、Linuxの既定ページキャッシュ管理の「素の姿」(本概念)と、その限界に対する研究的介入(cache_ext)の両方を把握できる。
## 未解決の問い
- ZFSのARC/L2ARCとLinuxのページキャッシュ/バッファキャッシュは設計思想(適応型置換 対 LRU近似)が異なるが、両者のヒット率・ワークロード適応性を定量的に比較した研究はあるか。
- dirty_ratio/dirty_bytesのデフォルト値がワークロードによってどの程度不適切になり、大きなI/Oバーストを引き起こすか。本章はメカニズムのみを説明しており、具体的なチューニング事例は7章(メモリ)に譲られている。
## 関連
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] — 本概念の原典解説(§8.3.2, §8.4.3)。
- [[ページキャッシュカスタマイズ]] — 同じページキャッシュを対象に、eBPFによる退避方針の拡張性を論じる関連概念。
## 出典
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.3.2, §8.4.3