Direct NFS Client の検証 その3(外部表でも使えるの!?再検証編)

前回の検証では、外部表や SQL*Loader 等、フラットファイルに対しては Direct NFS Client が動作しないことを v$dnfs_stats の NFS_READ/NFS_WRITE 列値が変化しないことで確認しました。
しかし、Direct NFS Client Oracle ホワイト・ペーパーによると、これらに対しても有効との記載がありました。

この真実を確かめるべく、今回は別の観点から調査してみたいと思います。

【調査方針】

・マウントオプション rsize/wsize を異なるサイズに設定した 2 つの NFS 領域(同一ディスク)を使用。
・それぞれの NFS 領域に全く同じ内容の外部表の元ファイルを配置して外部表を作成。
・各外部表に対する読み込み性能を比較。
→ この結果、性能差があれば Dirct NFS は有効になっていない(カーネル NFS のマウントオプションの影響を受けている)と言える。

【設定内容】

・NFS#1(/oradata/ora112/dnfs1)
 rsize=32768,wsize=32768   -> NFS(ver3)の Oracle 推奨値
 外部表(ext_tab1)の元ファイルを配置

・NFS#2(/oradata/ora112/dnfs2)
 rsize=512,wsize=512   -> 小さめのサイズを設定
 外部表(ext_tab2)の元ファイルを配置

マウント内容を確認。
※便宜上改行しています。

# mount -l | grep dnfs
serv2:/oradata/ora112/dnfs1 on /oradata/ora112/dnfs1 type nfs
      (rw,rsize=32768,wsize=32768,addr=serv2)
serv2:/oradata/ora112/dnfs2 on /oradata/ora112/dnfs2 type nfs
      (rw,rsize=512,wsize=512,addr=serv2)

v$dnfs_servers を確認。

SQL> select * from v$dnfs_servers;

        ID
----------
SVRNAME
-------------------------------------------
DIRNAME
-------------------------------------------
   MNTPORT    NFSPORT      WTMAX      RTMAX
---------- ---------- ---------- ----------
         1
serv2
/oradata/ora112/dnfs1
       838       2049      32768      32768

         2
serv2
/oradata/ora112/dnfs2
       838       2049      32768      32768

2行が選択されました。

WTMAX,RTMAX(マウントオプションでいう rsize,wsize)は、Direct NFS Client によって Oracle 推奨値の 32768 に調整されています。
これで I/O に Direct NFS Client が利用されているのであれば、どちらのマウントポイントでも同等の性能となる筈です。

では、それぞれの外部表の読み込み性能を確認してみます。

SQL> -- 外部表のパス確認
SQL> select e.table_name,e.location,d.directory_path
     from dba_external_locations e,dba_directories d
     where e.directory_name=d.directory_name;

TABLE_NAME      LOCATION        DIRECTORY_PATH
--------------- --------------- ------------------------------
EXT_TAB1        ext_tab.tbl     /oradata/ora112/dnfs1
EXT_TAB2        ext_tab.tbl     /oradata/ora112/dnfs2
  
SQL> -- select 性能測定
SQL> set timing on
SQL> -- NFS#1 配下の外部表
SQL> select count(*) from ext_tab1;

  COUNT(*)
----------
  10000000

経過: 00:00:18.71

SQL> -- NFS#2 配下の外部表
SQL> select count(*) from ext_tab2;

  COUNT(*)
----------
  10000000

経過: 00:00:47.97 

大きな差が出ました!
比較的大きな外部表の為、rsize,wsize が小さければ性能劣化に繋がります。
つまり、外部表の読み取りでは Direct NFS Client は動作していない(カーネル NFS のマウントオプションの影響を受けた)為、rsize,wsize の小さい NFS#2 の方が劣化したと判断できます。

尚、ファイルキャッシュによる性能差ではないことを確認する為、以下のコマンドでファイルキャッシュをクリアした上で複数回実行してみましたが、上記とほぼ同様に大きな差が生じることを確認しました。

# echo 3 > /proc/sys/vm/drop_caches

また、念の為、Direct NFS Client が動作するケースでも確認しました。
それぞれの NFS 領域にデータファイルを配置して通常表に対する性能を確認したところ、どちらの領域に置いた表でも同様の性能となりました。
こちらは、Direct NFS Client が動作している(カーネル NFS のマウントオプションは無視されている)と判断できます。

【結論】

やっぱりフラットファイルの I/O では Direct NFS Client は動作しない!!

と、断言したいところですが、ホワイトペーパーには使えると書いてありますので、実案件で検討したい場合は、オラクルサポートにご確認下さい m(_ _)m
そして、真相を私に教えて下さい(笑)