Re: nfs server issues

Rick Macklem <[email protected]> Tue, 7 Jul 2026 06:54:22 -0700
Newsgroups gmane.os.freebsd.devel.file-systems
Message-ID <CAM5tNy5oREM9S=+gzJYp8ahbtGVoeDJZYmEuZ854ZQE-3OzSqg@mail.gmail.com>
On Tue, Jul 7, 2026 at 1:52 AM Richard Purdie
<[email protected]> wrote:
>
> On Sat, 2026-07-04 at 12:41 -0700, Rick Macklem wrote:
> > On Sat, Jul 4, 2026 at 1:05 AM Richard Purdie
> > <[email protected]> wrote:
> > >
> > > nfsstat -E -s
> > > Server Info:
> > >       Getattr      Setattr       Lookup     Readlink         Read        Write
> > >   17354100116   1674996998   5136769057        40544  18429670397    986443058
> > >        Create       Remove       Rename         Link      Symlink        Mkdir
> > >             0     98646613    119865835     17071853            0            0
> > >         Rmdir      Readdir     RdirPlus       Access        Mknod       Fsstat
> > >             0   1655544711            0   4129535844            0            0
> > >        FSinfo     pathConf       Commit      LookupP      SetClId    SetClIdCf
> > >             0            0      8723436            0            0            0
> > One more thing to note. The # of Commits is much smaller than the # of Writes
> > on the top line. This "hints" that a lot of the Writes are being done File_sync.
> > (To check that, you'd need to capture packets and look at them in wireshark.)
> >
> > If a lot of the Writes are File_sync (which means the server must commit the
> > data/metadata changes to stable storage before replying), doing the "mirrored
> > pair of storage devices dedicated to the ZIL" could be what you need to get
> > writes to work well. (As I mentioned, the "cheat" alternative is to
> > set "sync=disabled",
> > but that runs a risk of data loss when the NFS server crashes/reboots.)
>
> I was able to find a way to increase the Open/Lock counts on the
> server. Most of the locking we do on the clients is from a tool called
> Bitbake and the locking is isolated to specific function. I maintain
> Bitbake and wrote/maintain the locking code over the <too many> years.
> I copied and pasted the relevant code straight from bitbake into a test
> script:
>
> https://valkyrie.yocto.io/pub/non-release/rptest/testlock.py
>
> (code is from
> https://git.openembedded.org/bitbake/tree/lib/bb/utils.py)
>
> Obviously it could easily be simplified more but I wanted to test our
> actual code. The lock file name/path is hardcoded at the end of the
> script but easily changed.
>
> I ran that script on three of the NFS clients for around 5 minutes. On
> the server, the counts went from:
>
> nfsdumpstate  | egrep 'fd01:172:16::242:2157|fd01:172:16::12|fd01:172:16:1::11  '
> CB                    2      6307        55        55         0         0 fd01:172:16::242:2157                         4c696e7578204e465376342e322064656269616e31322d766b2d31
> CB                    3      6543        77        77         0         0 fd01:172:16::12                               4c696e7578204e465376342e322064656269616e31322d766b2d33
> CB                    2      6571        83        83         0         0 fd01:172:16:1::11                             4c696e7578204e465376342e322064656269616e31322d766b2d32
>
> to:
>
> nfsdumpstate  | egrep 'fd01:172:16::242:2157|fd01:172:16::12|fd01:172:16:1::11  '
> CB                    2      6462        65        65         0         0 fd01:172:16::242:2157                         4c696e7578204e465376342e322064656269616e31322d766b2d31
> CB                    3      6679        83        83         0         0 fd01:172:16::12                               4c696e7578204e465376342e322064656269616e31322d766b2d33
> CB                    2      6691        88        88         0         0 fd01:172:16:1::11                             4c696e7578204e465376342e322064656269616e31322d766b2d32
>
> I've then stopped the scripts and waited and the counts just stayed
> there.
>
> I'd be very interested if someone else could reproduce that and if so,
> explain what is happening and if it is an issue?
The next step would be to run a test like the above while capturing packets.
# tcpdump -s 0 -w out.pcap host <nfs-client>
on the server should do it.

Then pull out.pcap into wireshark and look for LockU and Close operations.
(If you want, you can stick out.pcap somewhere and I can look at it.)

If the operations are failing (due to ESTALE, for example), then I could
consider allowing these operations to succeed even when the file no
longer exists. Both LockU and Close take a CFH (current file handle)
as arguments, which suggests a valid file handle is required (per the RFC)
but I can see the argument that "the file is gone, so allow it anyhow".

However, if the operations are not in the packet trace, then I'd call
that a client bug, since clients are expected to LockU byte range locks
and Close opens. (There is no server->client callback for Open or Locks.)

I will also make the generic statement...
NFS is not (and will never be, from what I've seen) a POSIX compliant
file system (due to limitations in the protocol design). As such, some POSIX
applications will not work well over NFS.

>
> I can't prove the write hangs are related to the counts but it does
> seem there is some issue there regardless as they don't make sense.
As I noted before, 15K Opens should not have any real effect. They are
just small in-memory data structures on linked lists anchored in hash tables.
(They might result in slightly slower response, due to the time taken for a
linked list traversal. Making the hash tables larger should resolve that and
only results in somewhat bigger tables, which is not a problem, given the
amount of memory in modern systems.)
--> To give you a clue, long ago when I developed this stuff, I tested 100
     NFS clients against a server with only a couple of Gbytes of ram
     (yes, a 32bit x86 around year 2000). I got it up to 500K Opens and it
      still worked).

rick

>
> Cheers,
>
> Richard