Rawディバイス対応について

InnoDBってRawディバイス対応なんですね(たぶん)。

バッファにしてもファイルにしても、領域確保の際にかならずアクセス単位(Pageサイズとかセクタサイズとか)1個分余分に取得して、alignしてます。

Oracleはパラメータか何かで設定して使うとか聞いた記憶があるけれども、InnoDBの場合はそういったユーザ側の制御方法は無く、Rawディバイスを使う使わないにかかわらず、Rawディバイスを使っていてもOKなコードが実行されます。

Rawディバイスってのが何なのか、恥ずかしながらよくは理解してなかったのだけれども、要するに一言で言うとカーネルのIOバッファを迂回してディバイスに対して直接読み込み・書き込みを行うための、カーネルがアプリケーションに提供している仕組みらしい。(あってる?)

http://www.linux.or.jp/JF/JFdocs/SCSI-2.4-HOWTO/rawdev.html
http://www.linux.or.jp/JM/html/util-linux/man8/raw.8.html

自前でバッファリングするソフトウェアの場合、そのほうがオーバーヘッドが減るし、「ACIDのために同期書き込みが必要」というような場合にもそのほうが便利という話らしい。(わざわざfsyncしなくて良いって事?)

とまあここまでは良かったのだけれども、以下のような「なんだってー!?」という記事を発見してしまった。
http://www.atmarkit.co.jp/flinux/rensai/watch2005/watch06b.html

Rawディバイスって将来のLinuxで削除されるの?? 「システムコールopen時にO_DIRECTを指定するようにソースコードを書き換える必要がうんぬん」って、もしそうなったらInnoDBもソース修正しなきゃですね。現状、O_RDWR指定のみなので。



追記:ちゃんとマニュアルに書いてある!

http://dev.mysql.com/doc/refman/5.0/en/innodb-raw-devices.html

You can use raw disk partitions as data files in the shared tablespace. By using a raw disk, you can perform non-buffered I/O on Windows and on some Unix systems without filesystem overhead, which may improve performance.

http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html

When using the InnoDB storage engine with a large innodb_buffer_pool_size value on any release of Solaris 2.6 and up and any platform (sparc/x86/x64/amd64), a significant performance gain can be achieved by placing InnoDB data files and log files on raw devices or on a separate direct I/O UFS filesystem (using mount option forcedirectio; see mount_ufs(1M)). Users of the Veritas filesystem VxFS should use the mount option convosync=direct.

オススメらしい。