rfjakob / gocryptfs

Encrypted overlay filesystem written in Go
https://nuetzlich.net/gocryptfs/
MIT License
3.57k stars 253 forks source link

Performance flags for use over sshfs (Mac) #614

Open knaccc opened 3 years ago

knaccc commented 3 years ago

I'm mounting a cipher directory over a 1GbE wired LAN via sshfs, and then mounting that via gocryptfs:

sudo mkdir /Volumes/cipher
sudo chown me:staff /Volumes/cipher
sshfs remoteuser@remote:/cipher /Volumes/cipher -o \
reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,allow_other,noapplexattr,noappledouble,\
defer_permissions,volname=displayName,IdentityFile=/Users/me/.ssh/id_ed25519
sudo mkdir /Volumes/plain
sudo chown me:staff /Volumes/plain
gocryptfs /Volumes/cipher /Volumes/plain

If I copy a 10GB file to the /Volumes/cipher directory (i.e. not via gocryptfs), it copies at 76.4 MB/s. If I copy a 10GB file to the /Volumes/plain directory (i.e. via gocryptfs), it copies at 33.8 MB/s.

gocryptfs -speed reports AES-GCM-256-Go 3963.06 MB/s (using gocryptfs v2.2.1 without_openssl)

Can anyone recommend any sshfs or other flags that might help increase performance please?

knaccc commented 3 years ago

After lots of searching, I've found that I have been able to increase r/w performance on the raw sshfs connection to 110 MB/s each way, and r/w performance via gocryptfs to 72MB/s write, 110MB/s read.

This was achieved by modifying and compiling sshfs 2.10 using instructions here: https://github.com/osxfuse/sshfs/issues/64

There is still the mystery of why gocryptfs is limited to 72MB/s write despite the sshfs connection being capable of 110MB/s.

Perhaps there is scope for gocryptfs in the future to use larger write buffers or other means to achieve higher throughput over sshfs?

rfjakob commented 3 years ago

The numbers you get look pretty good, but yes, gocryptfs performance over sshfs is limited for two reasons:

knaccc commented 3 years ago

@rfjakob Thanks for the insight.

FYI the performance tests above were from a Mac to a Linux server, with an average ping of 0.70ms.

I repeated the experiment to a remote Linux server with an average ping of 87ms, and I achieved an upload speed of 0.36 MB/s and a download speed of 2.20 MB/s via gocryptfs (over SSHFS).

Via SSHFS only, I get an upload speed of 1.5MB/s and a download speed of 13.0 MB/s.

ctroo commented 2 years ago

I'm using gocryptfs over sshfs between two linux cloud servers.

via only SSHFS: 83.7 MB/s

via gocryptfs v1.8: 14.5 MB/s

via gocryptfs v2.3: 5.4 MB/s

@rfjakob thanks for this awesome piece of software! I suspect my speeds are below expectation even considering the above explanation. Any reason my speed deteriorates with the newer version? Is there anything I can try to improve throughput?

gocryptfs --speed
gocryptfs 1.8.0; go-fuse 2.0.3; 2021-07-18 go1.15.9 linux/amd64
AES-GCM-256-OpenSSL      670.42 MB/s    
AES-GCM-256-Go          1314.56 MB/s    (selected in auto mode)
AES-SIV-512-Go           170.01 MB/s    
XChaCha20-Poly1305-Go    814.12 MB/s
gocryptfs --speed
gocryptfs v2.3 without_openssl; go-fuse v2.1.1-0.20211219085202-934a183ed914; 2022-08-28 go1.19 linux/amd64
cpu: AMD EPYC 7282 16-Core Processor; with AES acceleration
AES-GCM-256-OpenSSL             N/A
AES-GCM-256-Go              2738.07 MB/s    (selected in auto mode)
AES-SIV-512-Go               223.17 MB/s
XChaCha20-Poly1305-OpenSSL      N/A
XChaCha20-Poly1305-Go       1630.10 MB/s    (selected in auto mode)
sshfs --version
SSHFS version 3.7.1
FUSE library version 3.10.3
using FUSE kernel interface version 7.31
fusermount3 version: 3.10.3