このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

ファイルキャッシュ

  • I/Oデータをキャッシュする機能。
  • OSによって、バッファキャッシュ、ページキャッシュなど色々な名前が付いている。
  • ファイルキャッシュはDBMSが持つキャッシュとはまったく別のものである。
  • DBMSからディスクに書き込みをすると基本的にファイルキャッシュにそのデータが載る。DBMSがディスクから読み込むときも、ファイルキャッシュに載る。また、DBMSが読み込みをした場合にファイルキャッシュにデータがあれば、物理ディスクにはアクセスしない。こうすることで、I/O処理を少なくして高速化を実現する。
  • OSのファイルキャッシュは、OSの空きメモリがある限り、ある程度までは自動的に拡張する。
    • そのため、多くのOSではフリー(空き)メモリが少ないように見える。
  • ファイルキャッシュが増えればキャッシュによる性能向上が見込める。しかし、フリーメモリが減りすぎると遅くなる。そのため、フリーメモリが少なくなるとファイルキャッシュが減るようにOSが調整してくれる。
  • 通常の書き込みI/O(遅延書き込み)は、ファイルキャッシュにI/O命令のデータが置かれたらすぐに終了となる。その後、OSのデーモン(常駐プログラム)がディスクに書き込む。そのデーモンは次の通りである。
OSデーモン名
AIXsyncd
Solarisfsflush
Linuxbdflush
HP-UXsyncer
  • Windowsの場合はFILE_FLAG_NO_BUFFERINGを指定すると、ファイルキャッシュに載せないI/Oになる。
    • Windowsの場合、いくつかのDBMSではデフォルトでFILE_FLAG_NO_BUFFERINGが指定されている。
  • Linuxカーネル2.4の場合、同期書き込みであっても、ファイルキャッシュにデータが置かれた後に、I/Oはページサイズに細分化されてディスクに書き込まれていた。
    • そのため、I/Oは合計サイズが同じでも、数が増えれば余計に時間がかかった。そのため、これがボトルネックになり、DBMSの性能が悪化したケースがあった。
    • Linuxカーネル2.6では分割せずに書き込むようになったので、この問題は改善された。
  • DBMSのキャッシュとファイルキャッシュの役割は重複している。
    • どちらかというと、DBMS専用のキャッシュを大きくした方がよい。
      • ただし、DBMSのキャッシュを大きくしすぎると、ページングが始まってしまい意味がなくなってしまう。それに対して、ファイルキャッシュは自動的にサイズを調整するメリットがある。よって、DBMS専用のキャッシュを適切なサイズにすることが重要となる。