Table of Contents
DNFS key features
- Every Oracle Process ( DBWR, RMAN, PQ, LGWR) has its own TPC/IP connection
- NFS version 3 client embedded into kernel
- Failover capabilities
- Reduces CPU usage for Oracle instances ( disk I/O occurs at NFS server location )
- Works even for Windows
- Multiple pathes can be configured ( Oracle recommends using own subnet – see sample below )
- JUMBO frames are supported with DNFS
- OCR and Voting disks are not supported with DNFS
- RAC and CW uses O_DIRECT flag for write system calls to bypass any CACHE and directly talk to the NFS servers
- Datafiles which are concurrently read/written by multiple nodes need to be on a mount point with actimeo set to 0.
- Don’t set atimeo to 0 for NON-RAC setups
- DNFS provides faster performance than the native OS NFS as DNFS don’t need to copy the write buffer to the kernel space
- DNFS can’t store VOTING Disks and OCR as CSS is multi-threaded and DNFS is not thread safe
- ASM Dynamic Volume Manager ( Oracle ADVM ) does not currently support NFS-based ASM files.
- dNFS currently does not support NFSv4. dNFS on Oracle 11g will only work with NFSv3 volumes – 12c supports NFS V4
- dNFS does not support automouter and autofs. The volumes will have to be mounted explicitly as NFS volumes and should be visible via /etc/mtab
- Use oracle/oinstall for file protection for files and directories
Enable Direct NFS at database level
Verify whether current kernel already supports direct NFS $ ldd /u01/app/oracle/product/11204/racdb/bin/oracle | grep odm libodm11.so => /u01/app/oracle/product/11204/racdb/lib/libodm11.so (0x00007f475fa35000) $ strings /u01/app/oracle/product/11204/racdb/lib/libodm11.so | grep -i odm ... odm_fini odm_init odm_discover ODM ERR: Calling stubbed version Stubbed ODM Library, Version: 1.0 --> Stubbed ODM Library, Version: 1.0 means there DNFS is Disabled Stop RAC database and enable DNFS $ srvctl stop database -d grac4 $ srvctl status database -d grac4 Instance grac41 is not running on node grac41 Instance grac42 is not running on node grac42 Instance grac43 is not running on node grac43 $ cd $ORACLE_HOME/rdbms/lib $ make -f ins_rdbms.mk dnfs_on $ strings /u01/app/oracle/product/11204/racdb/lib/libodm11.so | grep -i odm .. kgodm_discover nfs odm heap kgodm event %u set to level %u --> Repeat above steps on grac42 and grac43 and startup RAC database $ srvctl start database -d grac4 Instance grac41 is running on node grac41 Instance grac42 is running on node grac42 Instance grac43 is running on node grac43 Verify uid,gid for NFS Server and RAC instances [oracle@ns1 ~]$ id uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),501(vboxsf),506(asmdba),54322(dba) [oracle@grac41 lib]$ id uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),500(vboxsf),506(asmdba),54322(dba context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [oracle@grac42 lib]$ id uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),500(vboxsf),506(asmdba),54322(dba context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [oracle@grac43 lib]$ id uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),500(vboxsf),506(asmdba),54322(dba context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Setup NFS Server and check NFS version
# mkdir /shared_data_nfs # chown oracle:oinstall /shared_data_nfs # ls -ld /shared_data_nfs drwxr-xr-x 2 oracle oinstall 4096 Dec 24 16:58 /shared_data_nfs Add the following lines to the "/etc/exports" file and verify the export parameters /shared_data_nfs *(rw,sync,no_wdelay,insecure,root_squash,anonuid=54321,anongid=54321) Options used: rw read write access insecure this option is sometimes very important as DNFS channels are not opened without ( Potential error message without this option : Direct NFS: Please check the permissions for server .... ) sync write all data to disk before returing from client write call no_wdelay don't wait on add. write request root_squash map files created by root to nobody user anonuid=54321 Oracle owner ID anongid=54321 Oracle GID ( oinstall ) --> Not sure whether anonuid and anongid works with OEL 6.x Run the following command to export the NFS shares # chkconfig nfs on # service nfs restart Shutting down NFS daemon: [FAILED] Shutting down NFS mountd: [FAILED] Shutting down NFS quotas: [FAILED] Starting NFS services: [ OK ] Starting NFS quotas: Starting NFS mountd: [ OK ] Stopping RPC idmapd: [ OK ] Starting RPC idmapd: [ OK ] Starting NFS daemon: [ OK ] # exportfs -v /shared_data_nfs <world>(rw,insecure,root_squash,no_subtree_check,anonuid=54321,anongid=54321) # rpcinfo | egrep 'vers|nfs' program version netid address service owner 100003 2 tcp 0.0.0.0.8.1 nfs superuser 100003 3 tcp 0.0.0.0.8.1 nfs superuser 100003 4 tcp 0.0.0.0.8.1 nfs superuser 100227 2 tcp 0.0.0.0.8.1 nfs_acl superuser 100227 3 tcp 0.0.0.0.8.1 nfs_acl superuser 100003 2 udp 0.0.0.0.8.1 nfs superuser 100003 3 udp 0.0.0.0.8.1 nfs superuser 100003 4 udp 0.0.0.0.8.1 nfs superuser 100227 2 udp 0.0.0.0.8.1 nfs_acl superuser 100227 3 udp 0.0.0.0.8.1 nfs_acl superuser --> NFS version 2,3 and 4 is available for TCP and UDP
Setup NFS client
Verify that the oracle instances can mount the NFS file system # showmount -e ns1 Export list for ns1: /shared_data_nfs * # mkdir -p /u01/oradata As we are using NFS4 edit /etc/idmapd.conf to specify your domain name and restart the Domain = example.com # service rpcidmapd restart Stopping RPC idmapd: [ OK ] Starting RPC idmapd: [ OK ] Add the following lines to the "/etc/fstab" file. ns1:/shared_data_nfs /u01/oradata nfs rw,bg,hard,nointr,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0 0 0 Mount the NFS shares # mount /u01/oradata Make sure the permissions on the shared directories are correct. # chown -R oracle:oinstall /u01/oradata Verify correct file creation as owner oracle $ touch /u01/oradata/grac41_testing $ ls -l /u01/oradata/grac41_testing -rw-r--r--. 1 oracle oinstall 0 Dec 25 09:42 /u01/oradata/grac41_testing --> Repeat the NFS client setup for all your remaining instances ( in my case: grac42, grac43 ) Direct NFS Client searches for mount entries in the following order: $ORACLE_HOME/dbs/oranfstab /etc/oranfstab /etc/mtab Oranfstab File oranfstab file with the following attributes for each NFS server to be accessed using Direct NFS Client: Server: The NFS server name. Local: Up to four paths on the database host, specified by IP address or by name, as displayed using the ifconfig command run on the database host. Path: Up to four network paths to the NFS server, specified either by IP address, or by name, as displayed using the ifconfig command on the NFS server. Export: The exported path from the NFS server. Mount: The corresponding local mount point for the exported volume. Mnt_timeout: Specifies (in seconds) the time Direct NFS Client should wait for a successful mount before timing out. This parameter is optional. The default timeout is 10 minutes (600). Dontroute: Specifies that outgoing messages should not be routed by the operating system, but instead sent using the IP address to which they are bound. Note that this POSIX option sometimes does not work on Linux systems with multiple paths in the same subnet. The following example uses both local and path. Since they are in different subnets, we do not have to specify dontroute. $ORACLE_HOME/dbs/oranfstab file on grac41: server: ns1 local: 192.168.1.101 path: 192.168.1.50 local: 192.168.3.101 path: 192.168.3.50 export: /shared_data_nfs mount: /u01/oradata --> Here we have 2 NICs on our NFS server ( 192.168.1.50 and 192.168.3.50 ) where the local RAC instance also has to NICS to NFS server communication ( 192.168.1.101 and 192.168.3.101 ) Verify settings with ifconfig Instance grac41: eth1 Link encap:Ethernet HWaddr 08:00:27:1E:7D:B0 inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0 eth3 Link encap:Ethernet HWaddr 08:00:27:95:59:EE inet addr:192.168.3.101 Bcast:192.168.3.255 Mask:255.255.255.0 NFS-server : eth1 Link encap:Ethernet HWaddr 08:00:27:8D:8A:93 inet addr:192.168.1.50 Bcast:192.168.1.255 Mask:255.255.255.0 RX packets:119581 errors:0 dropped:0 overruns:0 frame:0 TX packets:93205 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:25000344 (23.8 MiB) TX bytes:19165803 (18.2 MiB) eth2 Link encap:Ethernet HWaddr 08:00:27:74:3D:E1 inet addr:192.168.3.50 Bcast:192.168.3.255 Mask:255.255.255.0 RX packets:31976 errors:9 dropped:47 overruns:0 frame:0 TX packets:11345 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15615019 (14.8 MiB) TX bytes:8739912 (8.3 MiB) --> Load balancing takes place - but as eht1 interface is used for nameserver issues the traffic for eht1 should be higher Verify alert.log for DNFS support After reboot RAC instance alert.log should report: Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.0 Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab Direct NFS: channel config is: Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 39819 nfsport 2049 Direct NFS: channel id [0] path [192.168.1.50] to filer [ns1] via local [192.168.1.101] is UP Direct NFS: channel id [1] path [192.168.3.50] to filer [ns1] via local [192.168.3.101] is UP
Create table, tablespace, run a testcase and monitor gv$ tables
SQL> create tablespace dnfs_ts datafile '/u01/oradata/grac4_dnfs_ts.dbf' size 100M; SQL> create table rac_perftest ( id number, inst_name varchar(8), host_name varchar(24), ins_date date) tablespace dnfs_ts; Test case: $ java UCPDemo grac4 10 5000 1 -noseq -nodebug Monitor DNFS via GV$ performance table ( 10 Threads running clusterwide inserts ) THIS DB REPORT WAS GENERATED AT: 28-DEC-2013 10:06:53 HOSTNAME ASSOCIATED WITH THIS DB INSTANCE: grac41.example.com Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production SQL> select * from gv$dnfs_servers; INST_ID ID SVRNAME DIRNAME MNTPORT NFSPORT WTMAX RTMAX ------- ---------- ---------- ------------------------------ ---------- ---------- ---------- ---------- 1 1 ns1 /shared_data_nfs 39819 2049 65536 65536 3 1 ns1 /shared_data_nfs 39819 2049 65536 65536 2 1 ns1 /shared_data_nfs 39819 2049 65536 65536 SQL> select * from gv$dnfs_files; INST_ID FILENAME FILESIZE PNUM SVR_ID ------- ---------------------------------------- ---------- ----- ------ 1 /u01/oradata/grac4_dnfs_ts.dbf 104865792 18 1 3 /u01/oradata/grac4_dnfs_ts.dbf 104865792 17 1 2 /u01/oradata/grac4_dnfs_ts.dbf 104865792 17 1 SQL> select * from gv$dnfs_channels order by inst_id, PNUM; INST_ID PNUM SVRNAME PATH LOCAL STATE CH_ID SVR_ID SENDS RECVS PINGS RECO RESENDS SENT RESENT RECV SENDQ PENDQ RESTARTQ ------- ----- ---------- --------------- --------------- ---------------- ----- ------ ------- ------- ------- ------- ------- --------- ------- --------- ------- ------- -------- 1 18 ns1 192.168.1.50 192.168.1.101 CONNECTED 0 1 30 61 0 0 0 300772 0 5068 0 0 0 1 18 ns1 192.168.3.50 192.168.3.101 CONNECTED 1 1 32 61 0 0 0 300772 0 5068 0 0 0 1 20 ns1 192.168.1.50 192.168.1.101 CONNECTED 0 1 0 0 0 0 0 0 0 0 0 0 0 1 20 ns1 192.168.3.50 192.168.3.101 CONNECTED 1 1 0 0 0 0 0 0 0 0 0 0 0 2 17 ns1 192.168.1.50 192.168.1.102 CONNECTED 0 1 10 26 0 0 0 493480 0 1596 0 0 0 2 17 ns1 192.168.3.50 192.168.3.102 CONNECTED 1 1 10 22 0 0 0 255592 0 1316 0 0 0 2 19 ns1 192.168.1.50 192.168.1.102 CONNECTED 0 1 0 0 0 0 0 0 0 0 0 0 0 2 19 ns1 192.168.3.50 192.168.3.102 CONNECTED 1 1 0 0 0 0 0 0 0 0 0 0 0 2 46 ns1 192.168.1.50 192.168.1.102 CONNECTED 0 1 0 0 0 0 0 0 0 0 0 0 0 2 46 ns1 192.168.3.50 192.168.3.102 CONNECTED 1 1 0 0 0 0 0 0 0 0 0 0 0 2 52 ns1 192.168.1.50 192.168.1.102 CONNECTED 0 1 0 0 0 0 0 0 0 0 0 0 0 2 52 ns1 192.168.3.50 192.168.3.102 CONNECTED 1 1 0 0 0 0 0 0 0 0 0 0 0 3 17 ns1 192.168.1.50 192.168.1.103 CONNECTED 0 1 17 34 0 0 0 133732 0 2268 0 0 0 3 17 ns1 192.168.3.50 192.168.3.103 CONNECTED 1 1 16 32 0 0 0 133632 0 2240 0 0 0 SQL> select inst_id, PNUM, NFS_READ, NFS_WRITE, NFS_COMMIT, NFS_MOUNT from gv$dnfs_stats where NFS_READ>0 or NFS_WRITE>0 order by inst_id, PNUM; INST_ID PNUM NFS_READ NFS_WRITE NFS_COMMIT NFS_MOUNT ------- ----- ---------- ---------- ---------- ---------- 1 18 2 329 0 1 1 20 3 2 0 0 2 17 2 167 0 1 2 19 3 2 0 0 2 46 288 0 0 0 2 52 1 0 0 0 3 17 2 74 0 1 SQL> select c.inst_id, program, pid,pname, local, path from gv$process p, gv$dnfs_channels c where p.inst_id = c.inst_id and c.pnum = p.pid; INST_ID PROGRAM PID PNAME LOCAL PATH ------- ------------------------------------------------ ---------- ----- --------------- --------------- 1 oracle@grac41.example.com (DBW0) 18 DBW0 192.168.1.101 192.168.1.50 1 oracle@grac41.example.com (DBW0) 18 DBW0 192.168.3.101 192.168.3.50 1 oracle@grac41.example.com (CKPT) 20 CKPT 192.168.1.101 192.168.1.50 1 oracle@grac41.example.com (CKPT) 20 CKPT 192.168.3.101 192.168.3.50 3 oracle@grac43.example.com (DBW0) 17 DBW0 192.168.1.103 192.168.1.50 3 oracle@grac43.example.com (DBW0) 17 DBW0 192.168.3.103 192.168.3.50 2 oracle@grac42.example.com (DBW0) 17 DBW0 192.168.1.102 192.168.1.50 2 oracle@grac42.example.com (DBW0) 17 DBW0 192.168.3.102 192.168.3.50 2 oracle@grac42.example.com (CKPT) 19 CKPT 192.168.1.102 192.168.1.50 2 oracle@grac42.example.com (CKPT) 19 CKPT 192.168.3.102 192.168.3.50 2 oracle@grac42.example.com (J001) 46 J001 192.168.1.102 192.168.1.50 2 oracle@grac42.example.com (J001) 46 J001 192.168.3.102 192.168.3.50
Configure oranfstab with 2 independend DNFS paths but only 1 path maps to a correct IP address
server: ns1 local: 192.168.1.101 path: 192.168.1.50 local: 192.168.4.101 path: 192.168.3.50 export: /shared_data_nfs mount: /u01/nfs_asmdisks oracle@grac41 DNFS]$ ifconfig | grep addr eth1 Link encap:Ethernet HWaddr 08:00:27:74:37:E7 inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0 eth3 Link encap:Ethernet HWaddr 08:00:27:5B:62:89 inet addr:192.168.3.101 Bcast:192.168.3.255 Mask:255.255.255.0 --> Only 192.168.1.101 is valid --> 192.168.4.101 is a wrong entry in oranfstab and should be 192.168.3.101 Alert log: Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab Direct NFS: channel config is: channel id [0] local [192.168.1.101] path [192.168.1.50] channel id [1] local [192.168.4.101] path [192.168.3.50] Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 35621 nfsport 2049 Direct NFS: channel id [0] path [192.168.1.50] to filer [ns1] via local [192.168.1.101] is UP --> system comes up but only channel id [0] is reported as UP
Configure oranfstab with 2 independend DNFS paths and none of the paths maps to a correct IP address
server: ns1 local: 192.168.2.101 path: 192.168.1.50 local: 192.168.4.101 path: 192.168.3.50 export: /shared_data_nfs mount: /u01/nfs_asmdisks [oracle@grac41 DNFS]$ifconfig | grep addr eth1 Link encap:Ethernet HWaddr 08:00:27:74:37:E7 inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0 eth3 Link encap:Ethernet HWaddr 08:00:27:5B:62:89 inet addr:192.168.3.101 Bcast:192.168.3.255 Mask:255.255.255.0 --> both entries oranfstab are not valid ! Restart database SQL> startup force ORACLE instance started. Database mounted. --> db startup hangs Latest alert log entry : Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab Direct NFS: channel config is: channel id [0] local [192.168.2.101] path [192.168.1.50] channel id [1] local [192.168.4.101] path [192.168.3.50] Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 35621 nfsport 2049 --> alert.log stops here From diag trace file : grac41_dia0_7985_1.trc Verified Hangs in the System inst# SessId Ser# OSPID PrcNm Event ----- ------ ----- --------- ----- ----- 1 1 5 8275 FBGP rdbms ipc reply 1 18 1 8001 DBW0 Disk file operations I/O Victim Information Ignored HangID Inst# Sessid Ser Num OSPID Fatal BG Previous Hang Count ------ ----- ------ ------- --------- -------- ------------- ------- 1 1 18 1 8001 Y New Hang 1 *** 2014-07-19 08:38:46.034 Wait-For-Graphs collected at 07/19/14 08:37:55) =============================================================================== Non-intersecting chains: ------------------------------------------------------------------------------- Chain 1: ------------------------------------------------------------------------------- Oracle session identified by: { instance: 1 (grac4.grac41) os id: 8275 process id: 32, oracle@grac41.example.com (TNS V1-V3) session id: 1 session serial #: 5 } is waiting for 'rdbms ipc reply' with wait info: { p1: 'from_process'=0x11 p2: 'timeout'=0x316 time in wait: 1.028233 sec timeout after: 0.971767 sec wait id: 86 blocking: 0 sessions wait history: * time between current wait and wait #1: 0.000077 sec 1. event: 'rdbms ipc reply' time waited: 1.999915 sec wait id: 85 p1: 'from_process'=0x11 p2: 'timeout'=0x318 * time between wait #1 and #2: 0.000078 sec 2. event: 'rdbms ipc reply' time waited: 1.999948 sec wait id: 84 p1: 'from_process'=0x11 p2: 'timeout'=0x31a * time between wait #2 and #3: 0.000073 sec 3. event: 'rdbms ipc reply' time waited: 1.999958 sec wait id: 83 p1: 'from_process'=0x11 p2: 'timeout'=0x31c } and is blocked by => Oracle session identified by: { instance: 1 (grac4.grac41) os id: 8001 process id: 17, oracle@grac41.example.com (DBW0) session id: 18 session serial #: 1 } which is waiting for 'Disk file operations I/O' with wait info: { p1: 'FileOperation'=0x2 p2: 'fileno'=0x7 p3: 'filetype'=0x2 time in wait: 2 min 1 sec timeout after: never wait id: 56 blocking: 1 session wait history: * time between current wait and wait #1: 0.000005 sec 1. event: 'Disk file operations I/O' time waited: 0.000059 sec (last interval) time waited: 0.001539 sec (total) wait id: 54 p1: 'FileOperation'=0x2 p2: 'fileno'=0x6 p3: 'filetype'=0x2 * time between wait #1 and #2: 0.000000 sec 2. event: 'KSV master wait' time waited: 0.001341 sec wait id: 55 * time between wait #2 and #3: 0.000000 sec 3. event: 'Disk file operations I/O' time waited: 0.000139 sec wait id: 54 p1: 'FileOperation'=0x2 p2: 'fileno'=0x6 p3: 'filetype'=0x2 } Chain 1 Signature: 'Disk file operations I/O'<='rdbms ipc reply' Chain 1 Signature Hash: 0x7278e935 ------------------------------------------------------------------------------- --> its time to strace DBW0 process with OS - PID : 8001 # strace -p 8001 setsockopt(32, SOL_SOCKET, SO_SNDBUF, [262144], 4) = 0 setsockopt(32, SOL_SOCKET, SO_RCVBUF, [262144], 4) = 0 setsockopt(32, SOL_SOCKET, SO_RCVTIMEO, "\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 setsockopt(32, SOL_SOCKET, SO_SNDTIMEO, "\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 setsockopt(32, SOL_TCP, TCP_NODELAY, [1], 4) = 0 setsockopt(32, SOL_SOCKET, SO_LINGER, {onoff=0, linger=2}, 8) = 0 bind(32, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.4.101")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address) close(32) --> We can't bind to IP address 192.168.4.101 Is this address available and UP and running ? root@grac41 Desktop]# ifconfig | egrep 'inet addr|UP' inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:192.168.1.218 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:192.168.1.172 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:192.168.2.101 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:169.254.108.81 Bcast:169.254.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:192.168.3.101 Bcast:192.168.3.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 ---> IP addr 192.168.4.101 and 192.168.2.101 are not available - We need to correct oranfstab Change 192.168.4.101 to 192.168.3.101 192.168.2.101 to 192.168.1.101 and reboot your RAC node.
alert.log entries of a successful DNFS configuration with 2 channels
Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab
Direct NFS: channel config is:
channel id [0] local [192.168.1.101] path [192.168.1.50]
channel id [1] local [192.168.3.101] path [192.168.3.50]
Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 35621 nfsport 2049
Direct NFS: channel id [0] path [192.168.1.50] to filer [ns1] via local [192.168.1.101] is UP
Direct NFS: channel id [1] path [192.168.3.50] to filer [ns1] via local [192.168.3.101] is UP
Other Potential Errors
v$dnfs_files table is empty and and alert log reports : Some NFS servers require 'insecure' to be specified as part of the export alert.log Direct NFS: Please check the permissions for server ns1. Note: Some NFS servers require 'insecure' to be specified as part of the export. Alert.log with DNFS tracing events: Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab Direct NFS: channel config is: channel id [0] local [192.168.1.101] path [192.168.1.50] Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 58969 nfsport 2049 Direct NFS: Please check the permissions for server ns1. Note: Some NFS servers require 'insecure' to be specified as part of the export. --> Here we have missing entries for Direct NFS: channel id [0] path ... us UP Alert.log with DNFS tracing events after adding insecure to /etc/exports on our NFS server Direct NFS: attempting to mount /shared_data_nfs on filer ns1 defined in oranfstab Direct NFS: channel config is: channel id [0] local [192.168.1.101] path [192.168.1.50] Direct NFS: mount complete dir /shared_data_nfs on ns1 mntport 50847 nfsport 2049 Direct NFS: channel id [0] path [192.168.1.50] to filer [ns1] via local [192.168.1.101] is UP Direct NFS: channel id [1] path [192.168.1.50] to filer [ns1] via local [192.168.1.101] is UP
Trace Events
Direct NFS database events: SQL> alter system set event='19392 trace name context forever, level 8' scope=spfile sid='*'; SQL> alter system set event='19394 trace name context forever, level 8' scope=spfile sid='*'; SQL> alter system set event='19396 trace name context forever, level 2' scope=spfile sid='*';
Q&A
What are NFS mount options and how do they relate to DNFS? NFS mount options are meant for OS NFS client. They don’t affect Direct NFS in anyway. In that case why are we asked to configure mount options correctly? Because not all files are accessed via Direct NFS. For example: clusterware keep OCR, voting disk over NFS and uses OS native NFS client for access. My customer wants to use Bonding because this gives High Availability(HA). Direct NFS is designed to provide HA without any need of Bonding network interfaces. Few database installations may justify need for bonding and must be analyzed on case-to-case basis. What should be the value of the parameter fileystemio_options for Direct NFS? Direct NFS does not depend on the value of filesystemio_options. Direct NFS always issues async and direct I/O as it does not depend on OS support for the same. That said, we can always fall back to the OS NFS client in case of mis-configuration. Hence, once should set filesystemio_options to 'directio' or 'setall' if the OS supports it. Does server parameter in oranfstab be DNS resolved to an IP address? No, “server” parameter is just a heading for a particular set of parameters for given NFS server. Actual IP address (or DNS name) is given in “path” parameter. As such, local<->path forms unique network connection, where local specifies Direct NFS client local network endpoint, and path is NFS filer address. Value for “server” is printed in alert log whenever connection is established.
Important Bugs
9451706 DIRECT NFS DOES NOT SUPPORT UNSTABLE WRITES. 9977452 DNFS NIC FAILOVER CAUSES PAUSES AND DATABASE CRASH. 11655043 DNFS HUNG FOR 2 MIN WHEN A NIC IS REMOVED.
References
- How To Verify If DNFS Is Enabled (“ON”) Or Disabled (“OFF”) Before The Database Instance Is Started In 11.2 Release? (Doc ID 1551909.1)
- Are NFS v4 and automount supported with dNFS (Direct NFS) in 11g? (Doc ID 1087430.1)
- DNFS: Direct NFS: channel id [#] path [#] to filer [name] is DOWN / UP Message When Standby Database Is Idle. (Doc ID 1601500.1)
- NOTE:1468114.1 – TESTCASE Step by Step – Configure Direct NFS Client (DNFS) on Windows
- NOTE:456246.1 – How to Do NFSv4 Configure
- NOTE:1012325.1 – HOWTO: Setup a linux system to share files using NFS
- Howto Optimize NFS Performance with NFS options. (Doc ID 397194.1)
- Configure Direct NFS Client (DNFS) on Windows (Doc ID 1468114.1)
- Mount Options for Oracle files when used with NFS on NAS devices (Doc ID 359515.1)
- Direct NFS: FAQ (Doc ID 954425.1)
- Configure Direct NFS Client (DNFS) on Linux (11g) (Doc ID 762374.1)
- This note covers some Frequently Asked Questions related to Direct NFS (Doc ID 1496040.1)
- How to configure DNFS to use multiple IPs (Doc ID 1552831.1) (on different subnets)
- How to Setup Direct NFS client multipaths in same subnet (Doc ID 822481.1)
- Trace Files From dNFS Database: kgnfscrechan … Failed to get root fsinfo … on filer … error 1 (Doc ID 1507212.1)
- dNFS Hangs for Few Minutes During NIC Failover (Doc ID 1350245.1)
- Direct NFS not load balancing the client-side NICs (Doc ID 746656.1)
- http://blog.oracle48.nl/direct-nfs-configuring-and-network-considerations-in-practise/
Does ‘select * from gv$dnfs_files;’ show files written by rman?
Hi Blake,
Here is the description from the Oracle docu:
The following views are for managing Direct NFS Client in a cluster environment:
gv$dnfs_servers: Shows a table of servers accessed using Direct NFS Client.
gv$dnfs_files: Shows a table of files currently open using Direct NFS Client.
gv$dnfs_channels: Shows a table of open network paths (or channels) to servers for which Direct NFS Client is providing files.
gv$dnfs_stats: Shows a table of performance statistics for Direct NFS Client.
This means if you have already configured DNFS for your cluster all processes like RMAN, DBWR act as a client and must
use DNFS to read/write to the NFS based datafiles. If you don’t have and DNFS datafiles I can hardly believe RMAN is
using this protocol.