Direct NFS Client の検証 その1(設定編)

大容量のNASを使っている案件が多くなってきたなーと感じる今日この頃。
SASストレージに比べて安価なNASをOracleで上手く活用できないかなー??
と考えていたところ「Direct NFS Client」という機能があると知りました。

恥ずかしながら、つい最近知りました・・・
11gR1からの新機能なので、もう大分以前からの機能なんですね。
とは言え、それほど普及している機能ではないと思います。

この機能を一言で説明すると
「NFSサーバー上のOracleファイルとのI/Oを最適化する」
というようなものらしいです。

Oracleファイルって何を指すんだろうか?
データファイルはもちろんのことですが、
・アーカイブログファイルは?
・RMANバックアップファイルは?
・DataPumpのダンプファイルは?
・外部表、SQL*Loarderの元ファイル(CSVフラットファイル等)は?
etc…

データファイルをNASに置くというのは敷居が高いような気がしますが、アーカイブやバックアップの出力先としては十分に活用できるケースはありそうです。
個人的には、他システムで生成され外部NASに配置されたCSVファイルを外部表ロードするという処理を行っている案件があるので、この処理が高速化されるのであれば使ってみたいところです。

前置きはこの辺にして「Direct NFS Client」を試してみたいと思います。

■前提環境

前提として、NFSマウントの設定がされているものとします。
今回は、以下の構成でNFSの設定を行いました。

serv1
 NFS Client
 Redhat EL5
 Oracle 11.2.0.2
 NFSマウントポイント(serv2:/oradata/ora112)

serv2
 NFS Server
 Redhat EL5 

■設定手順

設定はいたって簡単です。
$ORACLE_HOME/lib/libodm11.so のシンボリックリンクのリンクの向き先を libnfsodm11.so に変更してインスタンスを再起動するだけです。
※オプションの設定ファイル「$ORACLE_HOME/dbs/oranfstab」というファイルを使うことも出来ますが、このファイルの設定は任意です。
今回は使っていません。下記のシンボリックリンク変更だけです。

$ cd $ORACLE_HOME/lib
$ ls -l libodm11.so
lrwxrwxrwx 1 oracle oinstall 12  9月 21  2010 libodm11.so -> libodmd11.so
$ 
$ 
$ mv libodm11.so libodm11.so.bk
$ ln -s libnfsodm11.so libodm11.so
$ ls -l libodm11.so
lrwxrwxrwx 1 oracle oinstall 14  3月 31 14:12 libodm11.so -> libnfsodm11.so
$ 
$ 
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Thu Mar 31 14:16:34 2011

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Release 11.2.0.2.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options

SQL> startup

■設定確認

インスタンス起動時のアラートログに以下のような出力が確認できました。

ALTER DATABASE OPEN
Thu Mar 31 15:43:59 2011
Direct NFS: attempting to mount /oradata/ora112 on filer 192.168.X.XXX defined in mtab
Direct NFS: channel config is:channel id [0] local [] path [192.168.X.XXX]
Direct NFS: mount complete dir /oradata/ora112 on 192.168.X.XXX mntport 785 nfsport 2049
Direct NFS: channel id [0] path [192.168.X.XXX] to filer [192.168.X.XXX] via local [] is UP
Direct NFS: channel id [1] path [192.168.X.XXX] to filer [192.168.X.XXX] via local [] is UP

「Direct NFS Client」の領域 /oradata/ora112 配下にデータファイルを作成します。
※今回、その他のデータベースファイルはASM上に配置しています。

SQL> create tablespace TS_DNFS datafile
     '/oradata/ora112/ts_dnfs.dbf' size 100M;

「Direct NFS Client」関連の V$ 表の結果結果は以下の通りです。

SQL> select * from v$dnfs_servers;

ID
----------
SVRNAME
-------------------------------------------
DIRNAME
-------------------------------------------
MNTPORT    NFSPORT      WTMAX      RTMAX
---------- ---------- ---------- ----------
serv2
/oradata/ora112
785       2049      32768      32768

1行が選択されました。

SQL> select * from v$dnfs_files;

FILENAME
-------------------------------------------
FILESIZE       PNUM     SVR_ID
---------- ---------- ----------
/oradata/ora112/ts_dnfs.dbf
104865792         16          1

1行が選択されました。

v$dnfs_stats には、「Direct NFS Client」を使った統計がプロセス単位で出力されるらしいです。
また、このビューにはプロセス番号(PNUM 列)しかなかったので v$process と結合すると良さそうです。

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

PROGRAM                         NFS_READ  NFS_WRITE
------------------------------- ---------- ----------
oracle@srv1 (PMON)                       0          0
oracle@srv1 (PSP0)                       0          0
oracle@srv1 (VKTM)                       0          0
oracle@srv1 (GEN0)                       0          0
oracle@srv1 (DIAG)                       0          0
oracle@srv1 (DBRM)                       0          0
oracle@srv1 (PING)                       0          0
oracle@srv1 (ACMS)                       0          0
oracle@srv1 (DIA0)                       0          0
oracle@srv1 (LMON)                       0          0
oracle@srv1 (ARC0)                       0          0
oracle@srv1 (ARC2)                       0          0
oracle@srv1 (LMD0)                       0          0
oracle@srv1 (RMS0)                       0          0
oracle@srv1 (LMHB)                       0          0
oracle@srv1 (MMAN)                       0          0
oracle@srv1 (DBW0)                       2          0
oracle@srv1 (LGWR)                       1          1
oracle@srv1 (CKPT)                       0          0
oracle@srv1 (SMON)                       0          0
oracle@srv1 (RECO)                       0          0
oracle@srv1 (RBAL)                       0          0
oracle@srv1 (ASMB)                       0          0
oracle@srv1 (MMON)                       0          0
oracle@srv1 (MMNL)                       0          0
oracle@srv1 (MARK)                       0          0
oracle@srv1 (SMCO)                       0          0
oracle@srv1 (TNS V1-V3)                  0          0
oracle@srv1 (W000)                       0          0
oracle@srv1 (W001)                       0          0
oracle@srv1 (QMNC)                       0          0
oracle@srv1 (Q000)                       0          0
oracle@srv1 (Q001)                       0          0

34行が選択されました。

今回はここまで。
動作検証は次回の記事で!