Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optionally disable FUSE_CAP_ASYNC_READ #395

Closed
rfjakob opened this issue May 8, 2021 · 1 comment
Closed

Optionally disable FUSE_CAP_ASYNC_READ #395

rfjakob opened this issue May 8, 2021 · 1 comment

Comments

@rfjakob
Copy link
Contributor

rfjakob commented May 8, 2021

For some backing storages (cloud drives), out-of-order and concurrent reads are expensive.
Give the caller the option to disable FUSE_CAP_ASYNC_READ so reads are in-order.

Patch is on gerrithub ( https://review.gerrithub.io/c/hanwen/go-fuse/+/516150 ), this ticket exists so I can show some graphs.

Reading a 10MB file off a gocryptfs per default looks like this:

normal

Removing FUSE_CAP_ASYNC_READ, it looks like this:

SyncRead

Spreadsheet attached for future reference here: SyncRead.ods

Read speed is 1GB/s in default mode, and 500MB/s with FUSE_CAP_ASYNC_READ disabled. The currently implemented delay-based workaround in gocryptfs (the -serialize_reads flag), get 97MB/s.

Exposing the option to disable FUSE_CAP_ASYNC_READ will allow gocryptfs to drop the delay-based workaround and get much better performance.

hanwen pushed a commit that referenced this issue Aug 2, 2021
We enable FUSE_CAP_ASYNC_READ per default, which means that
the kernel can (and does) submit multiple concurrent out-of-order
read requests to service userspace reads and kernel readahead.

For some backing storages, like Amazon Cloud Drive, out-of-order
reads are expensive.

gocryptfs has implemented a delay-based workaround with its
`-serialize_reads` flag for this case
(see rfjakob/gocryptfs#92 for details).

Not enabling FUSE_CAP_ASYNC_READ makes the kernel do this for us,
as verified by adding debug output to gocryptfs, so expose it as
a mount flag in MountOptions.

Fixes: #140
Graphs-at: #395
Related: rfjakob/gocryptfs#92
Change-Id: I10f947d71e1453989c4a9b66fbb0407f7163994f
@rfjakob
Copy link
Contributor Author

rfjakob commented Aug 30, 2021

Merged

@rfjakob rfjakob closed this as completed Aug 30, 2021
rfjakob added a commit to rfjakob/gocryptfs that referenced this issue Aug 30, 2021
Will be replaced by go-fuse's new SyncRead flag.

More info: hanwen/go-fuse#395
SyncRead commit: hanwen/go-fuse@15a8bb0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant