ACK: [SRU][Bionic][PATCH 0/3] NFSv4.1: Interrupted connections cause high bandwidth RPC ping-pong between client and server

Andrea Righi andrea.righi at canonical.com
Fri Jul 31 07:01:06 UTC 2020


On Wed, Jul 29, 2020 at 04:39:59PM +1200, Matthew Ruffell wrote:
> BugLink: https://bugs.launchpad.net/bugs/1887607
> 
> [Impact]
> 
> There is a bug in NFS v4.1 that causes a large amount of RPC calls between a 
> client and server when a previous RPC call is interrupted. This uses a large 
> amount of bandwidth and can saturate the network.
> 
> The symptoms are so:
> 
> * On NFS clients:
> Attempts to access mounted NFS shares associated with the affected server block 
> indefinitely.
> 
> * On the network:
> A storm of repeated RPCs between NFS client and server uses a lot of bandwidth. 
> Each RPC is acknowledged by the server with an NFS4ERR_SEQ_MISORDERED error.
> 
> * Other NFS clients connected to the same NFS server:
> Performance drops dramatically.
> 
> This occurs during a "false retry", when a client attempts to make a new RPC 
> call using a slot+sequence number that references an older, cached call. This 
> happens when a user process interrupts an RPC call that is in progress.
> 
> I had previously fixed this for Disco in bug 1828978, and now a customer has run
> into the issue in Bionic. A reproducer is supplied in the testcase section, 
> which was something missing from bug 1828978, since we never determined how the 
> issue actually occurred back then.
> 
> [Fix]
> 
> This was fixed in 5.1 upstream with the below commit:
> 
> commit 3453d5708b33efe76f40eca1c0ed60923094b971
> Author: Trond Myklebust <trond.myklebust at hammerspace.com>
> Date: Wed Jun 20 17:53:34 2018 -0400
> Subject: NFSv4.1: Avoid false retries when RPC calls are interrupted
> 
> The fix is to pre-emptively increment the sequence number if an RPC call is 
> interrupted, and to address corner cases we interpret the NFS4ERR_SEQ_MISORDERED 
> error as a sign we need to locate an appropriate sequence number between the 
> value we sent, and the last successfully acked SEQUENCE call.
> 
> The commit also requires two fixup commits, which landed in 5.5 and 5.8-rc6 
> respectively:
> 
> commit 5c441544f045e679afd6c3c6d9f7aaf5fa5f37b0
> Author: Trond Myklebust <trond.myklebust at hammerspace.com>
> Date:   Wed Nov 13 08:34:00 2019 +0100
> Subject: NFSv4.x: Handle bad/dead sessions correctly in nfs41_sequence_process()
> 
> commit 913fadc5b105c3619d9e8d0fe8899ff1593cc737
> Author: Anna Schumaker <Anna.Schumaker at Netapp.com>
> Date:   Wed Jul 8 10:33:40 2020 -0400
> Subject: NFS: Fix interrupted slots by sending a solo SEQUENCE operation
> 
> Commits 3453d5708b33efe76f40eca1c0ed60923094b971 and 
> 913fadc5b105c3619d9e8d0fe8899ff1593cc737 require small backports to bionic, as 
> struct rpc_cred changed to const struct cred in 5.0, and the backports swap them 
> back to struct rpc_cred since that is how 4.15 works.
> 
> [Testcase]
> 
> You will need four machines. The first, is a kerberos KDC. Set up Kerberos 
> correctly and create new service principals for the NFS server and for the 
> client. I used: nfs/nfskerb.mydomain.com and nfs/client.mydomain.com.
> 
> The second machine will be a NFS server with the krb5p share. Add the nfs server 
> kerberos keys to the system's keytab, and set up a NFS server that exports a 
> directory with sec=krb5p. Example export:
> /mnt/secretfolder *.mydomain.com(rw,sync,no_subtree_check,sec=krb5p)
> 
> The third machine is a regular NFS server. Export a directory with normal 
> sec=sys security. Example export:
> /mnt/sharedfolder *.mydomain.com(rw,sync)
> 
> The fourth is a desktop machine. Add the client kerberos keys to the system's 
> keytab. Mount both NFS shares, making sure to use the NFS v4.2 protocol. I used 
> the commands:
> mount -t nfs4 nfskerb.mydomain.com:/mnt/secretfolder /mnt/secretfolder_client/
> mount -t nfs4 nfs.mydomain.com:/mnt/sharedfolder /mnt/sharedfolder_client
> 
> Check "mount -l" to ensure that NFS v4.2 is used:
> nfskerb.mydomain.com:/mnt/secretfolder on /mnt/secretfolder_client type nfs4 
> (rw,relatime,vers=4.2,<...>,sec=krb5p,<...>)
> nfs.mydomain.com:/mnt/sharedfolder on /mnt/sharedfolder_client type nfs4 
> (rw,relatime,vers=4.2,<...>,sec=sys,<...>)
> 
> Generate some files full of random data. I found 20MB from /dev/random works 
> great.
> 
> Open each NFS share up in tabs in Nautilus. Copy the random data files to the 
> sec=sys NFS share. When they are done, one at a time cut and then paste the file 
> into the sec=krb5p NFS share. The bug will trigger either on the first, or 
> subsequent tries, but less than 10 tries are needed usually.
> 
> There is a test kernel available in the following PPA:
> https://launchpad.net/~mruffell/+archive/ubuntu/sf285439-test
> 
> If you install the test kernel, files will cut and paste correctly, and NFS will 
> work as expected.
> 
> [Regression Potential]
> 
> The changes are localised to NFS v4.1 and 4.2 only, and other versions of NFS 
> are not affected. If a regression occurs, users can downgrade NFS versions to 
> v4.0 or v3.x until a fix is made.
> 
> The changes only impact when connections are interrupted, and under typical blue 
> sky scenarios would not be invoked.
> 
> There have been several attempts to fix this in the past, starting with
> f9312a541050 "NFSv4.1: Fix the client behaviour on NFS4ERR_SEQ_FALSE_RETRY", and
> stemming to the commit mentioned in the fix section, along with its two other
> fixup commits. This seems to be an ongoing issue where edge cases crop up.
> I won't be surprised if there are further commits down the line.
> 
> [Other Info]
> 
> When I first submitted this fix for SRU, I believed that the fix was:
> 
> commit 02ef04e432babf8fc703104212314e54112ecd2d
> Author: Chuck Lever <chuck.lever at oracle.com>
> Date: Mon Feb 11 11:25:25 2019 -0500
> Subject: NFS: Account for XDR pad of buf->pages
> 
> This is not the case. This was a false positive fix. What it did was break NFSv4 
> GETACL and FS_LOCATIONS requests. When you tried to reproduce, the calls were 
> never made since they were broken, and thus could not be interrupted, and 
> cutting and pasting files worked fine.
> 
> When you applied the fixup commit 29e7ca715f2a0b6c0a99b1aec1b0956d1f271955 to 
> fix NFSv4 GETACL and FS_LOCATIONS requests, the problem returns, as GETACL and 
> FS_LOCATIONS are free to be interrupted and start a high bandwidth ping pong.

Looks good to me. Thanks for the detailed explanation!

Acked-by: Andrea Righi <andrea.righi at canonical.com>



More information about the kernel-team mailing list