# Raw IOとDirect IO ## 定義 Raw I/OとDirect I/Oは、いずれもカーネル・ファイルシステムがサポートしていればアプリケーションが使える、ファイルシステムキャッシュを迂回する異なるタイプのI/Oである。**Raw I/O**はファイルシステムを素通りしてディスクオフセットに直接発行される。ファイルシステムキャッシュより自分でデータ管理・キャッシングをうまく行いたいデータベースのようなアプリケーションが使ってきたが、ソフトウェアが複雑になり、バックアップ/復元や統計量観測に通常のファイルシステムツールセットを使えないという欠点がある。**Direct I/O**はファイルシステムを使いつつキャッシュをバイパスできる方式で、LinuxではO_DIRECTフラグを指定してopen(2)を呼び出す。同期書き込みに似ているがO_SYNCのような保証はなく、読み出しにも同様に働く。ファイルオフセットからディスクオフセットへのマッピングはファイルシステムコードが担うため、Raw I/Oほど直接的ではなく、ファイルシステムのレコードサイズに合わせてI/Oサイズが変更されたりEINVALエラーになったりする場合がある。ファイルシステムによっては、読み出しキャッシング・書き込みバッファリングだけでなくプリフェッチも無効になることがある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.3.8) ## マイクロベンチマークにおける位置づけ ファイルシステムのマイクロベンチマークの一覧(オペレーションタイプ・I/Oサイズ・オフセットパターン等)にDirect I/Oは含まれないことが多い。その理由は、Direct I/Oのマイクロベンチマークの目的が「ファイルシステムをバイパスしてディスクデバイスそのもののパフォーマンスをテストすること」にあり、ファイルシステムの性能テストとは目的が異なるためである。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.5.8) ## 横断的知見 - 本概念に触れたソースは現時点で1件([[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]])のため、複数ソース突き合わせによる知見の蓄積は今後の ingest に委ねる。 ## 未解決の問い - Raw I/Oは「データベースのようなアプリケーションが使ってきた」と過去形で語られているが、現代のクラウドデータベース(Aurora、Spanner等)がRaw I/OとDirect I/Oのどちらを主に採用しているか、本章には記載がない。 - io_uring(Linux 5.1で追加、§8.3.9で言及)がRaw I/O・Direct I/Oの使われ方にどう影響したか、本章執筆時点(2020年)以降の展開は範囲外。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] — 本概念の原典解説(§8.3.8, §8.5.8)。 - [[ファイルシステムキャッシュ階層]] — Raw I/O・Direct I/Oが迂回する対象であるキャッシュ階層の定義。 ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 8 ファイルシステム]] §8.3.8, §8.5.8