2007-04-12
■[mysql]InnoDBのflush_methodによる違い
パラメータで言うとinnodb_flush_method っていう奴。
ようはトランザクションログなどをディスクに反映するときにfsync(2)を使うか、そもそもファイルをopen(2)するときにカーネルのバッファをバイパスするようなオプションを使うかの違い。デフォルトだとfsyncdataになるため前者になるが、Linuxの場合O_DIRECTを指定することで後者の動作となる。
InnoDBはI/Oのバッファリングを独自に行うことが出来るので、OSが提供するキャッシュを切ってしまった方がメモリの無駄が少ない。
例によって使ったベンチマークはsysbench-0.4.8、MySQLは5.0.37
Threads | fdatasync | O_DIRECT |
1 | 19.8 | 20.31 |
2 | 20.88 | 21.04 |
3 | 21.06 | 20.64 |
4 | 20.89 | 20.78 |
5 | 21.15 | 21.03 |
6 | 20.73 | 21.02 |
7 | 20.92 | 21.03 |
8 | 21.46 | 21.25 |
平均 | 20.86 | 20.89 |
結論としては、0.1%ぐらいしか差はありませんでした、と。この設定に変える効用はむしろカーネルとアプリ側でメモリを二重に確保してしまうことによる無駄を回避することなので単純な書き込み性能は劣化しませんよという程度。InnoDBしか使わないのであれば、innodb_buffer_pool_sizeをメモリいっぱいまで確保してやるという手もある。
その他の測定条件は前回と同じ。ただし、今回はトランザクションをシミュレーションするcomlex modeで実行した。