topimg.jpg


Oracleの同期IOと非同期IOについて

●同期IO
・例
Oracle内で、
①プロセス1のCPU処理
②プロセス1のIO処理
③プロセス2のCPU処理
④プロセス2のIO処理
の4つの処理あると仮定すると、同期IOでは①→②→③→④の順でしか処理ができない。なぜならば、ディスクへの書き込みが完了するまでプロセスはスリープ状態になり、次のプロセスを開始できないためだ。この方式の場合、CPU、IOの処理に余裕があるときに、一方の処理が開始できないため、効率的にリソースを利用できない。

・特徴
通常のプロセスのディスクへの書き込み処理は、
プロセス→OSのバッファキャッシュ→ファイル
の順で行われ、書き込み処理自体はOSのバッファキャッシュへの書き込みが完了した時点で結果がプロセスへ返される。

Oracleの場合、プロセス(DBWRプロセスやLGWRプロセス)のディスクへの書き込み処理は、
Oracleのバッファキャッシュ→プロセス→OSのバッファキャッシュ→データファイル
の順で行われるが、プロセス(DBWRプロセスやLGWRプロセス)のディスクへの書き込み処理は、データファイルに物理的に書き込みが完了しないと処理が完了しない。

そのため、Oracleのディスク書き込み処理は、通常のプロセスの処理に比べ、時間がかかる方式となっている。このような方式になっている理由は、メモリ上のデータとディスク上のデータの整合性を保つ必要があるからだ。Oracleは、ディスク上のデータファイルをオープンするときO_SYNCフラグ(ファイルを同期IOモードでオープンし、write()処理が完了するまでプロセスに結果を返さない)を用いてwrite()を実行している。




●非同期IO
・例
Oracle内で、
①プロセス1のCPU処理
②プロセス1のIO処理
③プロセス2のCPU処理
④プロセス2のIO処理
の4つの処理あると仮定すると、非同期IOでは①→②、③→④が並行して処理される。非同期IOモードでは、ディスクへの書き込みが完了する前に、次のプロセス処理を先に実行することができる。この方式の場合、CPU、IO処理をそれぞれ連続で実行できるため、効率的にリソースを利用できる。

・特徴
Linux版Oracleは、9i R2より非同期IOのサポートを開始している。デフォルトでは非同期IOを利用する設定になっていない。
(非同期IOの対応・デフォルト設定に関しては、OSやOracleのバージョンによって異なるため、上記は一概には言えない。)

非同期IOによって、IO処理が完了する前にどんどん次の書き込み命令を出すことができるので、プロセスのCPU処理とディスクIO処理を並行して行うことが可能になる。そのため、Oracleの処理全体も効率化され性能の向上につながる。
(非同期IOのメモリとディスクのデータ整合性担保の問題は、どう対応したのだろうか・・・)

当然OS側での非同期IOの対応も必要だが、Oracleインストール時にlibaioパッケージをちゃんと入れているから大丈夫、多分。
(OS側でなんらかの設定変更必要なのだろうか?)

●Direct IO
同期IO処理における、
Oracleのバッファキャッシュ→プロセス→OSのバッファキャッシュ→データファイル
の中で、「OSのバッファキャッシュ」への書き込み(いわゆる、プロセスとOSカーネル間とのデータのやりとり)は余計な部分であり、その分オーバヘッドになっている。
Direct IOモードでは、
Oracleのバッファキャッシュ→プロセス→データファイル
のように、OSのバッファキャッシュへ書き込みをすることなく、プロセスが直接データファイルに書き込み可能になる。それによって、性能の若干の向上と、メモリ使用量の抑制につながる。

Direct IOは、O_DIRECTフラグを使ってファイルをオープンしているので、RAWデバイスのようなOS側での設定変更は不要。

参考
りなっくす奮闘記 その17 非同期I/OとDirectI/Oを使ってみよう
http://www.oracle.co.jp/2shin/ora83/22_23.html
openとO_SYNC
http://rarfaxp.riken.go.jp/~baba/tips/opensync.html
Linux上のOracle Real Application Clustersの記憶領域オプション
http://otndnld.oracle.co.jp/tech/linux_win/pdf/rac_wp.pdf




なお、非同期IOとDirect IOは同時設定可能である。

FILESYTEMIO_OPTIONSは、次のいずれかの値に設定できます。
ASYNCH: ファイル・システム・ファイル上の非同期I/Oを有効にします。非同期I/Oでは、転送に対する時間的な要件はありません。
DIRECTIO: ファイル・システム・ファイル上の直接I/Oを有効にします。直接I/Oでは、バッファ・キャッシュがバイパスされます。
SETALL: ファイル・システム・ファイル上の非同期および直接I/Oを有効にします。
NONE: ファイル・システム・ファイル上の非同期および直接I/Oを無効にします。


引用
Oracle Database パフォーマンス・チューニング・ガイド10gリリース2(10.2)9 オペレーティング・システム・リソース
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/ch23_os.htm
スポンサーサイト
  1. 2010/03/07(日) 05:32:24|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0
<<RAWデバイスについて | ホーム | Oracleの起動と停止>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://192168111.blog71.fc2.com/tb.php/30-cdfa03da
この記事にトラックバックする(FC2ブログユーザー)