NFS specific TCP socket buffer tuning with Solaris 10 update 10 (08/11) or later (Doc ID 1510324.1)

Last updated on AUGUST 01, 2016

Applies to:

Solaris Operating System - Version 10 8/11 U10 and later
Information in this document applies to any platform.

Goal

Prior to Solaris 10 8/11 (Solaris 10 update 10), NFS TCP connections have always utilized socket buffer sizes as defined by the system default tcp ndd tcp_[recv,xmit]_hiwat parameters.   When using UDP, the udp_[recv,xmit]_hiwat tunables were used. 

The downside of the tcp_recv_hiwat and tcp_xmit_hiwat tuning for NFS is that this has the potential to affect many (or all) TCP connections on a system, not just NFS.   The system global tuning affects any application connections in which the application does not specify it's own buffer values.     

This is changed as of Solaris 10 update 10 (08/11) with these patches:

   147268-01 (sparc) / 147269-01 (x86) SunOS 5.10: nfs patch

or the
   147440-05 (sparc) / 147441-05 (x86) SunOS 5.10: Solaris kernel patch  (which supersedes 147268-01).

and with the release of Solaris 11.   As of these patch levels / releases, Solaris NFS clients and servers will utilize 1 (one) Megabyte socket buffers for NFS traffic.

The new feature also introduces NFS specific socket buffer tuning, via these /etc/system values:

    rpcmod:rpc_recv_bufsz
    rpcmod:rpc_send_bufsz

As noted, both default to 1 MB (1048576 bytes).  

These tunables will only be used when they are set to values greater than the ndd tcp_recv_hiwat or tcp_xmit_hiwat values, respectively.  

There is also a tunable to use the original method, which causes NFS to utilize the system-wide parameters; the ndd tcp_*_hiwat settings in Solaris 10, or the tcp recv_buf and send_buf ipadm(1M) TCP properties in Solaris 11.   The "always follow tcp settings" tunable is rpcmod:rpc_default_tcp_bufsz=1 (it's 0 by default).

The logic involved works like this:
 
   if rpcmod:rpc_default_tcp_bufsz=1
      use Solaris 10 tcp_[recv,xmit]_hiwat or the or the Solaris 11 recv_buf and send_buf tcp values (set via ipadm(1M) )
      -> this is the original method

   else
      receive buffer: use the greater of rpc_recv_bufsz or Solaris 10 tcp_recv_hiwat (Solaris 11 recv_buf)
      transmit buffer: use the greater of rpc_send_bufsz or Solaris 10 tcp_xmit_hiwat (Solaris 11 send_buf)

The default rpc_recv_bufsz and rpc_send_bufsz is 1MB (1048576 bytes).

Solution

Sign In with your My Oracle Support account

Don't have a My Oracle Support account? Click to get started

My Oracle Support provides customers with access to over a
Million Knowledge Articles and hundreds of Community platforms