From 701e10b12105a4f4c632915698d3ede6ad591802 Mon Sep 17 00:00:00 2001 From: Colin Date: Thu, 28 Mar 2024 18:47:22 +0000 Subject: [PATCH] hosts/common/fs: optimize NFS options --- hosts/common/fs.nix | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/hosts/common/fs.nix b/hosts/common/fs.nix index 159fa9d1..2a7ecb9c 100644 --- a/hosts/common/fs.nix +++ b/hosts/common/fs.nix @@ -23,7 +23,8 @@ let # N.B.: `remote-fs.target` is a dependency of multi-user.target, itself of graphical.target. # hence, omitting `noauto` can slow down boots. noauto = [ "noauto" ]; - # lazyMount: defer mounting until first access from userspace + # lazyMount: defer mounting until first access from userspace. + # see: `man systemd.automount`, `man automount`, `man autofs` lazyMount = noauto ++ automount; wg = [ "x-systemd.requires=wireguard-wg-home.service" @@ -67,18 +68,31 @@ let # actimeo=n = how long (in seconds) to cache file/dir attributes (default: 3-60s) # bg = retry failed mounts in the background # retry=n = for how many minutes `mount` will retry NFS mount operation + # intr = allow Ctrl+C to abort I/O (it will error with `EINTR`) # soft = on "major timeout", report I/O error to userspace + # softreval = on "major timeout", service the request using known-stale cache results instead of erroring -- if such cache data exists # retrans=n = how many times to retry a NFS request before giving userspace a "server not responding" error (default: 3) # timeo=n = number of *deciseconds* to wait for a response before retrying it (default: 600) # note: client uses a linear backup, so the second request will have double this timeout, then triple, etc. + # proto=udp = encapsulate protocol ops inside UDP packets instead of a TCP session. + # requires `nfsvers=3` and a kernel compiled with `NFS_DISABLE_UDP_SUPPORT=n`. + # UDP might be preferable to TCP because the latter is liable to hang for ~100s (kernel TCP timeout) after a link drop. + # however, even UDP has issues with `umount` hanging. + # + # N.B.: don't change these without first testing the behavior of sandboxed apps on a flaky network. nfs = common ++ [ - # "actimeo=10" - "bg" - "retrans=4" + # "actimeo=5" + # "bg" + "retrans=1" "retry=0" + # "intr" "soft" - "timeo=15" + "softreval" + "timeo=30" "nofail" # don't fail remote-fs.target when this mount fails (not an option for sshfs else would be common) + # "proto=udp" # default kernel config doesn't support NFS over UDP: (see comment 11). + # "nfsvers=3" # NFSv4+ doesn't support UDP at *all*. it's ok to omit nfsvers -- server + client will negotiate v3 based on udp requirement. but omitting causes confusing mount errors when the server is *offline*, because the client defaults to v4 and thinks the udp option is a config error. + # "x-systemd.idle-timeout=10" # auto-unmount after this much inactivity ]; }; remoteHome = host: {