Direct NFS Client の検証 その2(動作確認編)

前回の続き。
今回は、様々な処理で実際に Direct NFS Client が動作しているのかどうか確認してみたいと思います。
以下の処理について、v$dnfs_stats の NFS_READ、NFS_WRITE が増加するかどうか確認してみます。

1. データファイル I/O(データファイルを配置)
2. 外部表ロード(外部表のCSVファイルを配置)
3. SQL*Loader ロード(ロード用のCSVファイルを配置)
4. DataPump(ダンプファイルの出力先に指定)
5. アーカイブログ(log_archive_dest に指定)
6. RMAN バックアップ(バックアップの出力先に指定)
7. XML監査ログ(audit_trail=XML、audit_file_dest に指定)

では、早速データファイルから。
単純にテーブルに対する I/O(select、DML、commit等)を行いました。
DBWR、LGWR プロセスが、Direct NFS 領域に対して READ/WRITE を行ったことが分かります。
まぁ、これは予想通り、当たり前の結果ですかね。

SQL> select program,nfs_read,nfs_write
     from v$process p,v$dnfs_stats d
     where p.pid=d.pnum and (nfs_read > 0 or nfs_write > 0);

PROGRAM                              NFS_READ  NFS_WRITE
---------------------------------- ---------- ----------
oracle@srv1 (DBW0)                          2          1
oracle@srv1 (LGWR)                          1          1

次に、最も気になっている外部表ロード。
前回も書きましたが、現在関わっている案件で使っているのでこれが早くなると嬉しいところです。
外部表の元ファイルを Direct NFS のマウントポイントに配置し、外部表の作成、外部表の Select を行ってみましたが・・・

SQL> select program,nfs_read,nfs_write
     from v$process p,v$dnfs_stats d
     where p.pid=d.pnum and (nfs_read > 0 or nfs_write > 0);

PROGRAM                              NFS_READ  NFS_WRITE
---------------------------------- ---------- ----------
oracle@srv1 (DBW0)                          2          1
oracle@srv1 (LGWR)                          1          1

???
さっきの結果と変わらず何もカウントアップされてない???
検索条件をちょっと変えて、v$session の event 列も出して確認。

SQL> select p.program,s.event,d.nfs_read,d.nfs_write
     from v$dnfs_stats d,v$process p,v$session s
     where p.pid=d.pnum and p.addr=s.paddr;

PROGRAM                 EVENT                   NFS_READ NFS_WRITE
----------------------- ----------------------- -------- ---------
oracle@srv1 (DBW0)      rdbms ipc message              2         1
oracle@srv1 (LGWR)      rdbms ipc message              1         1
oracle@srv1 (CKPT)      rdbms ipc message              0         0
oracle@srv1 (SMON)      smon timer                     0         0
oracle@srv1 (RECO)      rdbms ipc message              0         0
oracle@srv1 (RBAL)      rdbms ipc message              0         0
oracle@srv1 (ASMB)      ASM background timer           0         0
oracle@srv1 (MMON)      rdbms ipc message              0         0
oracle@srv1 (MMNL)      rdbms ipc message              0         0
oracle@srv1 (SMCO)      rdbms ipc message              0         0
oracle@srv1 (TNS V1-V3) external table read            0         0
 ・
 ・
 ・

“external table read(= 外部表読み込み)” では使われないらしい・・・
残念。。。
同様のアルゴリズムである SQL*Loader でも使われませんでした。

結局データファイルだけしか使えないのかなー???
と思った矢先、DataPump の expdp/impdp では Direct NFS が使われました。
DataPump の実行中に DMnn、DWnn というプロセスが I/O 操作を行っていることが確認できました。

PROGRAM                              NFS_READ  NFS_WRITE
---------------------------------- ---------- ----------
oracle@srv1 (DM00)                          0          2
oracle@srv1 (DW00)                          2         14

DataPump が大丈夫なら、アーカイブログ、RMAN バックアップでも使われるかな?
ログスイッチを実行すると、ARCn が書き込みを行いました。

PROGRAM                              NFS_READ  NFS_WRITE
---------------------------------- ---------- ----------
oracle@srv1 (ARC0)                          0          4

RMAN バックアップ操作を実行。
こちらもちゃんと使われてました。

PROGRAM                 EVENT                      NFS_READ NFS_WRITE
----------------------- -------------------------- -------- ---------
oracle@srv1 (TNS V1-V3) RMAN backup & recovery I/O      168       118

最後に監査ログ(XML)。
audit_trail=XML にし、audit 設定を行い監査ログを出力。
こちらは NG。

<結論>

【Direct NFS Client が動作する処理】

・データファイル I/O(データファイルを配置)
・DataPump(ダンプファイルの出力先に指定)
・アーカイブログ(log_archive_dest に指定)
・RMAN バックアップ(バックアップの出力先に指定)

【Direct NFS Client が動かない処理】

・外部表ロード(外部表のCSVファイルを配置)
・SQL*Loader ロード(ロード用のCSVファイルを配置)
・XML監査ログ(audit_trail=XML、audit_file_dest に指定)

ということでフラットファイルの扱いには使われないみたいです。

次回、パフォーマンス検証!
と思っていたのですが、そんな潤沢なマシンで検証できていないことと、以下のホワイトペーパーで十分に検証されているようなので割愛したいと思います。

Direct NFS Client Oracle ホワイト・ペーパー

劇的に向上するようなことはなさそうですが、複数経路の NIC を用意することでパフォーマンスが向上する可能性が高くなるようです。

また、複雑なマウントオプションを使ってチューニングする必要がないので、それだけでもメリットかもしれません。

んん???
このホワイトペーパーを読んでみたら、SQL*Loader、外部表にも有効と書いてありました!!
でも、v$dnfs_stats は変わってないし。。。
もう少し調べてみないといけなそうですね。
こちらは次の機会に!

いずれにせよ、設定はとても容易なものですので、NAS を活用する際には Direct NFS Client を試してみては如何でしょうか?