Closed jti-lanl closed 8 years ago
Implemented 3, because we needed it anyhow. That did not fix the problem.
Implemented 4, as well. That fixes the problem, somewhat, but gives us about half of the normal fuse BW, presumably because of all the "moments" of waiting (but maybe also because some close/reopens happen).
And ...
Implemented 6.
This now allows the NFS server to run with multiple threads, exporting marfs fuse.
For a single client, I'm seeing fuse-like BW through the fuse-mount. Multiple readers on the client, going through the same NFS mount, seem to get aggregate BW about the same as the single-threaded fuse BW.
On the server, do not mount fuse with direct_io
, as that seems to guarantee that fuse will receive 4KB requests from nfsd, rather than 128KB. I was mounting fuse with -o allow_other,use_ino
.
The default client timeout on an NFS mount with TCP is 60 seconds, which might be a bit long. I tested with something like this. Leaving off the timeout doesn't typically seem to hurt, and it might cause performance trouble if the object-server is sluggish responding.
mount -t nfs -o tcp,lookupcache=none,rsize=$((1 * 1024 * 1024)),wsize=131072,timeo=100 10.146.0.2:/marfs_nfs /marfs_nfs
Our current approach is to close and reopen the object-stream. For the case of a single-threaded reader who is actually seeking to different offsets and reading, this is probably the right solution. But, in the case of NFS, we'll be receiving a sequence of concurrent reads, some of which may arrive out-of-order. Or maybe they arrive in order, but do not complete before another arrival. Either way, some read-handler gets what looks like a discontiguous read. In this case, after resolving the thread-safety issue (see item #130), we could do something smarter.
possible fix(es):