InnoDB で fsync しない方法と、そのメリット

InnoDB はデフォルトでは同期I/O *1だけど、

innodb_flush_method=nosync

っていう隠しオプションがあって、それを有効にすると MyISAM みたく fsync しなくなるよ。ってソースコードちら見した自分が言ってた。

この設定がうれしいのって、どういう時だろう?

MySQL – Wikipedia にも書いてあるけど、スレーブ運用してて「クラッシュしたらリカバリで数時間かかるし、データ一貫性チェックするくらいだったらバックアップからリストアして再開しちゃうもんね〜」的な向きにはおすすめなのかしらん。

とは言え、fsync しないってことは OS のページキャッシュに書込みデータが滞留することになる → buffer_pool 削る必要が出てくる → 無駄な I/O が増える、わけで、設定するメリットがあるかどうかは知らない。swappiness=0 にしといて、数百MBのページキャッシュに RAID BBU キャッシュと同等の役割をさせる、ってのはあるのかな。でも、そういうケースなら inndb_flush_log_at_trx_commit=[0|2] にしとけば同等のパフォーマンスが出そうに思う。

あるいは、バッファプールが小さい、ウェブサーバと MySQL を混在させているような環境で、MyISAM に迫るパフォーマンスを稼ぎたい時とかは便利なのかも。

*1:fsync, O_DIRECT, O_SYNC 等を使うということ