概要
- ディスクから直接データを取得 する方が、 メモリキャッシュ より高速な場合があるという実験的証拠
- CPU性能の伸び悩み と ストレージ帯域の急成長 が背景
- 従来のキャッシュ戦略 が必ずしも最適ではない現状
- ベンチマーク による詳細なパフォーマンス比較
- io_uring など新しいI/O技術の活用が鍵
ディスク直読みは本当にメモリキャッシュより速いのか?
- 従来の常識 :「未使用メモリはディスクキャッシュに使うのが最適」というComputer Scienceのドグマ
- 最新のハードウェア事情 :ディスク(特にSSD)の帯域幅は 指数関数的に増加、一方でメモリアクセス遅延は ほぼ停滞
- 仮説 :ディスクから直接データを読む方が、メモリキャッシュを使うよりも高速な場合がある
実験環境
- CPU :AMD EPYC 7551P 32-Core
- メモリ :DDR4 2133MHz 96GB
- ストレージ :Samsung PM983a PCIe 3.0 SSD(1.92TB×2、RAID0構成)
- メモリ帯域(理論値) :シングルスレッドで約13GB/s
- SSD帯域(理論値) :合計6.2GB/s
- データセット :50GB
ベンチマーク内容
- 乱数整数(0〜20)をバッファに書き込み、「10」の個数をカウント
- mmap()による単純ループ での実装
- 初回(ディスクから読み込み):0.61GB/s
- 2回目(ページキャッシュ利用):3.71GB/s
- perfによる解析 :シングルスレッドかつ非ベクトル命令でCPU性能がボトルネック
ループのアンローリングとベクトル化
- ループを16回分アンローリング し、ベクトル命令(AVX2など)を利用
- パフォーマンス :5.51GB/s(ページキャッシュ利用時)
- 理論値13GB/sには届かないが、元のコードより50%高速化
- CPUのベクトル命令最適化 が重要
SSD直読みの限界とio_uringの活用
- mmap()によるデフォルトのI/O はカーネルのページフォールト処理がボトルネック
- SSDの理論帯域を活かしきれない (0.61GB/sはSATA SSDよりは速いが、NVMeのポテンシャルの1割程度)
- 本気で高速I/Oを実現するには、ユーザ空間でI/Oパイプラインを組む必要
- io_uringベースのI/Oエンジン を自作し、6ワーカー・キュー深度8192・16KBバッファで最大速度を狙う
まとめ:新しいI/O戦略が必要な時代
- CPUの進化が鈍化 する一方で、 ストレージ帯域の伸び が著しい
- 従来の「キャッシュ優先」戦略 ではハードウェア性能を活かしきれないケースが増加
- io_uring などの新技術を活用し、 I/Oパイプラインを最適化 する必要
- 「ディスクは遅い、メモリは速い」という常識の再考 が求められる
- 今後のシステム設計 では、「何をキャッシュするか」よりも「どのようにI/Oを組むか」が重要なテーマ
この内容は、 現代的なハードウェア環境 における I/O最適化 の新しい指針を示しています。 io_uring や ベクトル化 などの技術を駆使し、 システム全体のボトルネック を見極めて設計することが、今後ますます重要となるでしょう。