Linux でページキャッシュを使用せずに、ユーザ空間のバッファからデバイスに Direct I/O を行いたい場合、Kernel 2.4 ではrawデバイスが使用されていたが、Kernel 2.6 からはrawデバイスは推奨されなくなり、O_DIRECTを使用してデバイス・ファイルに Direct I/O する方法が推奨されるようになった。
なんとなく知っていましたが、オンライン・マニュアルなどで調べてみました。
参考
4.13.1 デバイス・ネーミングの永続的な変更の概要
Linux 2.6カーネルでは、RAWデバイスは推奨されなくなりました。推奨されるストレージ・アクセスは、O_DIRECTを使用したブロック・デバイスへの直接I/Oです。この変更に伴い、RHEL4とOEL4のファイル/etc/sysconfig/rawdevice、およびRHEL5とOEL5のファイル/etc/udev/rules.d/60-raw.rulesは非推奨になりました。詳細は、Linuxのドキュメントで2.6カーネルについて参照してください。
Oracle Databaseリリース・ノート
2.16 ブロック・デバイスを使用したOracle Databaseファイル用の記憶域の構成
(中略)
2. /etc/udev/rules.dのルール・ファイルを作成または変更し、データファイルの権限をデフォルトのroot所有権から変更します。作成するファイルがディストリビューションに適していることを確認します。たとえば、Asianux、Red Hat Enterprise Linux、Oracle LinuxおよびSUSE Enterprise Serverシステムで、このファイルに99-oracle.rulesという名前を付けます。
例2-1 ユーザーoracleを設定したルール・ファイルの例
/etc/udev/rules.d/99-oracle.rules # # ASM disks KERNEL=="sdb[6-9]", OWNER="oracle", GROUP="dba", MODE="0660" KERNEL=="sdb10", OWNER="oracle", GROUP="dba", MODE="0660"例2-2 ユーザーgridを設定したルール・ファイルの例
/etc/udev/rules.d/99-oracle.rules # # ASM disks KERNEL=="sdb[6-9]", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sdb10", OWNER="grid", GROUP="asmadmin", MODE="0660"Oracle Databaseのインストール前の作業
O_DIRECT (Linux 2.4.10 以降)
Man page of OPEN
このファイルに対する I/O のキャッシュの効果を最小化しようとする。このフラグを使うと、一般的に性能が低下する。しかしアプリケーションが独自にキャッシングを行っているような特別な場合には役に立つ。ファイルの I/O はユーザー空間バッファに対して直接行われる。 O_DIRECT フラグ自身はデータを同期で転送しようとはするが、 O_SYNC のようにデータと必要なメタデータの転送が保証されるわけではない。同期 I/O を保証するためには、 O_DIRECT に加えて O_SYNC を使用しなければならない。「注意」の節 (下記) の議論も参照。ブロックデバイスに対する似通った意味のインターフェースが raw(8) で説明されている (但し、このインタフェースは非推奨である)。
いったん raw デバイスをブロックデバイスにバインドすると、その raw デバイスはバインド先のブロックデバイスと同じようにオープンしたり read/write できる。しかし raw デバイスの動作はブロックデバイスと全く同じではない。特に違う点としては、 raw デバイスへのアクセスは、カーネルのブロックバッファキャッシュを全く用いない。全ての I/O は、その I/O を行ったプロセスのアドレス空間に対して直に行われる。もし下層にあるブロックデバイスドライバが DMA をサポートしていると、データコピーを全く行わなくても I/O を完了することができる。
Man page of RAW
- KROWN#129223
- NOTE 220970.1
- NOTE 605828.1
- NOTE 357492.1
- Linuxシステムプログラミング P.42
関連
- Redhat EL5 での raw デバイスの設定方法 - ablog
- キャラクタデバイスだとブロックバッファをバッファページにキャッシュしない - ablog
- バッファページにブロックバッファをキャッシュするのはファイルシステムではない? - ablog
- 初期化パラメータ filesystemio_options の値によってI/Oに関するシステムコールがどのように変化するか - ablog
追記(2011/07/04):
Oracle Databaseファイル用の記憶域、OCR、Voting Disk、ASMデバイスでブロック・デバイスの使用が推奨されている、つまりストレージを扱う最下層ではrawデバイスではなく、ブロック・デバイスが推奨されるようですね。
4.10 2.6カーネル・ディストリビューションでのOracle Clusterware用ストレージ・デバイスの構成
Oracle Databaseリリース・ノート
この項は、Red Hat Enterprise Linux 5(RHEL5)またはOracle Enterprise Linux 5(OEL5)上のOracle10gリリース2(10.2.0)RACのインストールまたは移行を行うデータベース管理者とシステム管理者、あるいはOracle RACおよびOracle ClusterwareのRAWデバイスを構成する必要があるデータベース管理者とシステム管理者向けの記述です。Linux 2.6カーネルとそのディストリビューションでは、追加の構成手順が必要です。次の項目について説明します。
4.10.1 デバイス・ネーミングの永続的な変更の概要
Oracle Databaseリリース・ノート
(中略)
udevにデフォルト設定を適用した場合、サーバーを再起動すると投票ディスクのデバイス・ファイル名と所有者、あるいはOracleクラスタ・レジストリ・パーティションが変更され、それらは失われます。たとえば、ユーザーcrsが所有する/dev/sddというデバイス上の投票ディスクは、サーバーの再起動後、rootが所有する/dev/sdfというデバイスに置かれます。
4.10.3 RAWデバイスからブロック・デバイスへのOracle Clusterwareファイルの場所の移動
Oracle Databaseリリース・ノート
Oracle Clusterwareのファイルは、RAWデバイスからブロック・デバイスに移動することをお薦めします。