「Oracle 環境向け高速化ツール“ODM”で「rawデバイスの悩み」を解消しよう」でも説明したとおり、Oracle Disk Manager(ODM)は以下の3つの特徴を備えている。
- 通常のファイルシステム(VxFS)とまったく同じ使い勝手を提供
- カーネルレベルで非同期I/Oを実装し、複数のI/Oリクエストを一括実行
- ファイルシステムによるバッファリングをスキップ
まず管理者から見てODMは、ファイルシステム(VxFS)上にOracleデータベース(以下、Oracle)を構築して運用するケースとまったく同じ使い勝手を提供する。つまりODMの導入にともない、Oracleの構築手順や運用手順が大きく変わる部分はない。よって、前編で述べたようなrawデバイスの管理性の低さを解消し、ファイルシステムの利便性をフルに発揮できる。
次に、ODMの大きな特徴は、HP-UXのカーネルレベルで非同期I/Oを実装している点だ。前編でも述べたとおり、ODMはオラクルが策定した専用APIに基づいて開発された製品であり、ODMが備わる環境ではOracleが同APIを通じて非同期のI/Oリクエストを発行する。これについて、以下に詳しく説明しよう。
周知のとおり、OracleのメモリバッファであるSGAとディスク間のデータ読み書きを司るのは、DBWRプロセスである。よってOracleをファイルシステム上に構築すると、このDBWRがread()/pread()やwrite()/pwrite()といった標準的なUNIXのI/Oシステムコールを繰り返し実行し、ファイルシステムを介したデータアクセスを実行する。
こうした標準的なファイルI/Oを通じてOracleを動作させる場合、次のような問題が生じる。
- 多数の同期・非同期I/Oが発生
さまざまな種類のI/Oリクエストが多数発生するため、ファイルシステムが介在することによるオーバーヘッドが生じる。同期I/Oも多いため、データが実際にディスク上に書き出されたり、ディスク上から読み込まれたりするまで、リクエスト元のスレッドは待ち状態となる。非同期I/Oについても、処理完了を確認するポーリングが必要となる。
- データのフラグメンテーション
データベースのように大規模の連続したデータに特化していないので、データがディスク上の各所に分散して記録される。
- ファイルオープンの競合
あるプロセスが書き込み中のファイルはOSによってロックされるため、他のプロセスが同時に書き込むことができない。
- バッファの重複
Oracleとファイルシステムのそれぞれが個別にバッファを持ち、オーバーヘッドが生じるほか、サーバのメモリ・リソースがムダに分割されてしまう。
そこでODMでは、標準のシステムコールの代わりに、Oracleによるファイルアクセス専用の非同期I/Oシステムコールであるodm_io()を利用する。これにより、以下のようなメリットが得られる。
- I/Oリクエストを少数の非同期I/Oに集約
odm_io()システムコールは非同期であるため、DBWRのスレッドはディスクの読み書き完了を待つ必要がなく、直ちに次の処理に取りかかれる。また、odm_io()ではDBWRが発する複数のI/Oリクエストをひとつに集約し、まとめてOSに指示できる。そのためI/O処理の回数が減り、オーバーヘッドが減少する。
- フラグメンテーションの防止
ディスク上の連続した領域にファイルを記録するため、大規模の連続したデータに効率よくアクセスできる。
- ファイルロックのバイパス
ファイルオープン時の競合を解消する。
- Direct I/Oモードの利用
ファイルシステムのバッファをスキップするDirect I/Oモードを用いることで、バッファ重複によるオーバーヘッドを解消し、かつサーバのメモリをフルにSGAに割り当て可能になる。
- ODM識別子の利用
通常のファイル記述子を使わず、プロセス間で共有可能なODM識別子によりファイルを管理し、カーネルリソースの消費が減少する。

 |
| 図1:Direct I/Oモードによるバッファ重複の解消 |
|
このように、ODMではOracleに特化したシステムコールやI/Oメカニズムを用意することで、ファイルシステムを扱いながらもオーバーヘッドをきわめて低く抑えることに成功している。
|