MySQL の InnoDB はファイルキャッシュを有効活用できますか？


AP サーバーに同居させる形で MySQL を動かしている場合、物理メモリの80%などをメモリ上にバッファ確保する、といった使い方はあまり好ましくないです。

むしろ、なるべく最小限で動かして、利用可能ならばファイルキャッシュを活用してくれた方が、サーバー管理する側からすれば嬉しくなります。

### 質問

  * MySQL で InnoDB を利用している場合に、 MySQL はどれだけ OS のファイルキャッシュを有効活用できますか？ 
    * より具体的に言うと、`innodb_buffer_pool_size` を小さく絞っているが、メモリは十分に大きい場合、その中で `innodb_buffer_pool_size` を十分大きくした場合と比べて、パフォーマンスはどのように変化しますか？

### 想定環境

  * MySQL は linux で動作させる想定です。




<https://sh2.hatenablog.jp/entry/20101205>

^ 記事は少し古いですが、上記のページが、この質問に対しての参考になると思いました。内容は、 innodb_flush_method を O_DIRECT
にすることで、パフォーマンスがどのように変化していくか、を述べています。

上記のページなどを読んで自分が理解したことをまとめると:

  * MySQL の innodb_flush_method は、デフォルトでは fsync であり、これは OS キャッシュが効くような設定になっている。一方、 O_DIRECT を利用すると、 Unix の direct IO 機能を用いて、データファイル (InnoDB データ) の読み書きができるようになる。この場合、 OS のキャッシュ機構がまるまる迂回される。
  * データのすべてが innodb_buffer_pool に乗らない場合、 fsync の方がパフォーマンスが向上する。これは、 OS キャッシュが利用できているから。
  * すべてのデータが OS キャッシュに乗っていたとしても、 innodb_buffer_pool を 8MB など小さくしていくと、パフォーマンスは劣化する。 
    * これは、 MySQL がデータを読み込む際にまずファイルの内容を buffer_pool にコピーするが、OS にキャッシュされていたとしても、そのコピーのオーバーヘッドが発生しているのではと個人的には推察している。

結論としては、 OS キャッシュはそれなりにパフォーマンスに寄与している。ただ、 innodb
のバッファプールに乗っけられるならば、乗っけた方がパフォーマンスはずっと高い。メモリが許すならば、バッファプールは取れるだけ取った方がよい。




<https://sh2.hatenablog.jp/entry/20101205>

^ 記事は少し古いですが、上記のページが、この質問に対しての参考になると思いました。内容は、 innodb_flush_method を O_DIRECT
にすることで、パフォーマンスがどのように変化していくか、を述べています。

上記のページなどを読んで自分が理解したことをまとめると:

  * MySQL の innodb_flush_method は、デフォルトでは fsync であり、これは OS キャッシュが効くような設定になっている。一方、 O_DIRECT を利用すると、 Unix の direct IO 機能を用いて、データファイル (InnoDB データ) の読み書きができるようになる。この場合、 OS のキャッシュ機構がまるまる迂回される。
  * データのすべてが innodb_buffer_pool に乗らない場合、 fsync の方がパフォーマンスが向上する。これは、 OS キャッシュが利用できているから。
  * すべてのデータが OS キャッシュに乗っていたとしても、 innodb_buffer_pool を 8MB など小さくしていくと、パフォーマンスは劣化する。 
    * これは、 MySQL がデータを読み込む際にまずファイルの内容を buffer_pool にコピーするが、OS にキャッシュされていたとしても、そのコピーのオーバーヘッドが発生しているのではと個人的には推察している。

結論としては、 OS キャッシュはそれなりにパフォーマンスに寄与している。ただ、 innodb
のバッファプールに乗っけられるならば、乗っけた方がパフォーマンスはずっと高い。メモリが許すならば、バッファプールは取れるだけ取った方がよい。

