比 sshfs 更快地挂载远程文件系统的方法?

Cur*_*ind 92 linux remote filesystems nfs sshfs

我一直在使用 sshfs 远程工作,但它真的很慢而且很烦人,尤其是当我在上面使用 eclipse 时。

有没有更快的方法在本地挂载远程文件系统?我的第一要务是速度。

远程机器是 Fedora 15,本地机器是 Ubuntu 10.10。如有必要,我也可以在本地使用 Windows XP。

Mee*_*com 51

如果您需要提高 sshfs 连接的速度,请尝试以下选项:

oauto_cache,reconnect,defer_permissions,noappledouble,nolocalcaches,no_readahead
Run Code Online (Sandbox Code Playgroud)

命令将是:

sshfs remote:/path/to/folder local -oauto_cache,reconnect,defer_permissions
Run Code Online (Sandbox Code Playgroud)

  • 为什么是`no_readahead`? (6认同)
  • `nolocalcaches` 不会通过强制查找 **every** 操作来*降低*性能吗?这与`auto_cache`相矛盾吗? (5认同)
  • 谢谢,为我工作!虽然必须删除`defer_permissions`(未知选项)。 (3认同)
  • nolocalcaches 和 defer_permissions 在 Debian Jessie 上似乎不再有效(不再?)。 (2认同)

ala*_*and 22

除了已经提出的使用 Samba/NFS 的解决方案,这是完全有效的,您还可以sshfs通过使用更快的加密来实现一些速度提升(身份验证将像往常一样安全,但传输的数据本身更容易解密)通过提供-o Ciphers=arcfour选项到sshfs。如果您的机器 CPU 较弱,这将特别有用。

  • 那是因为命令中有多个拼写错误。我已经编辑过了。我注意到我的树莓派服务器有 15% 的加速。(+1) (7认同)
  • chacha20-poly1305@openssh.com 密码也是一个值得考虑的选项,现在 arcfour 已经过时了。Chacha20 在 ARM 处理器上比 AES 更快,但在带有 AES 指令的 x86 处理器上要差得多(现在所有现代台式机 CPU 都将其作为标准配置)。https://klingt.net/blog/ssh-cipher-performance-comparison/ 您可以使用“ssh -Q cipher”列出支持的密码 (6认同)

小智 20

sshfs 使用的是 SSH 文件传输协议,这意味着加密。

如果你只是通过 NFS 挂载,它当然更快,因为没有加密。

您是否尝试在同一网络上安装卷然后使用 NFS

  • 它不是因为加密而变慢,而是因为它是 FUSE 并且它不断检查文件系统状态而变慢。 (44认同)
  • @Sparhawk 吞吐量和延迟之间存在差异。FUSE 为您提供了相当高的延迟,因为它必须使用一些非常低效的方法检查文件系统状态。arcfour 为您提供良好的吞吐量,因为加密更简单。在这种情况下,延迟是最重要的,因为这是导致编辑器在列出和加载文件时变慢的原因。 (25认同)
  • @w00t 我不认为是 FUSE 减慢了它的速度,而不是加密。将加密更改为 arcfour 为我加快了速度,而使用 `scp` 和 `sshfs` 一样慢。 (3认同)
  • @w00t。啊好吧。好点。 (3认同)

joe*_*dle 15

我没有任何替代方法可以推荐,但我可以提供有关如何加速 sshfs 的建议:

sshfs -o cache_timeout=115200 -o attr_timeout=115200 ...
Run Code Online (Sandbox Code Playgroud)

当您尝试读取先前在会话中检索到的文件的内容或权限时,这应该可以避免一些往返请求。

sshfs 在本地模拟删除和更改,因此在本地计算机上所做的新更改应该立即出现,尽管超时时间很大,因为缓存数据会自动删除。

但是不推荐这些选项如果远程文件可能在本地机器不知道的情况下(例如,由其他用户或远程 ssh shell)更新,。在这种情况下,较低的超时将是可取的。

以下是我尝试过的更多选项,但我不确定它们中是否有任何一个有所不同:

sshfs_opts="-o auto_cache -o cache_timeout=115200 -o attr_timeout=115200   \
-o entry_timeout=1200 -o max_readahead=90000 -o large_read -o big_writes   \
-o no_remote_lock"
Run Code Online (Sandbox Code Playgroud)

您还应该查看Meetai在他的回答中推荐的选项

递归

我的工作流程中最大的问题是当我尝试读取许多文件夹时,例如在深树中,因为 sshfs 分别为每个文件夹执行往返请求。这也可能是您在使用 Eclipse 时遇到的瓶颈。

并行请求多个文件夹可能会对此有所帮助,但大多数应用程序不会这样做:它们是为具有预读缓存的低延迟文件系统而设计的,因此它们会等待一个文件统计信息完成,然后再转到下一个.

预缓存

但是 sshfs 可以做的是提前查看远程文件系统,在我请求之前收集文件夹统计信息,并在连接没有立即被占用时将它们发送给我。这将使用更多带宽(来自从未使用过的前瞻数据)但可以提高速度。

我们可以强制 sshfs 进行一些预读缓存,方法是在您开始执行任务之前运行它,或者甚至在您的任务已经进行时在后台运行:

find project/folder/on/mounted/fs > /dev/null &
Run Code Online (Sandbox Code Playgroud)

这应该预先缓存所有目录条目,减少往返行程的一些后期开销。(当然,你需要像我之前提供的那样使用大超时,否则这个缓存的数据将在你的应用程序访问它之前被清除。)

但这find需要很长时间。与其他应用程序一样,它会在请求下一个文件夹之前等待来自一个文件夹的结果。

可以通过要求多个查找进程查看不同文件夹来减少总时间。我还没有测试过这是否真的更有效。这取决于 sshfs 是否允许并行请求。(我认为确实如此。)

find project/folder/on/mounted/fs/A > /dev/null &
find project/folder/on/mounted/fs/B > /dev/null &
find project/folder/on/mounted/fs/C > /dev/null &
Run Code Online (Sandbox Code Playgroud)

如果你还想预缓存文件内容,你可以试试这个:

tar c project/folder/on/mounted/fs > /dev/null &
Run Code Online (Sandbox Code Playgroud)

显然,这将花费更长的时间,将传输大量数据,并且需要您拥有巨大的缓存大小。但是当它完成时,访问文件应该感觉很好而且很快。


小智 7

经过搜索和试用。我刚刚发现增加-o Compression=no了很多速度。延迟可能是由压缩和解压缩过程引起的。此外,使用 'Ciphers=aes128-ctr' 似乎比其他人更快,而一些帖子对此做了一些实验。然后,我的命令是这样的:

sshfs -o allow_other,transform_symlinks,follow_symlinks,IdentityFile=/Users/maple/.ssh/id_rsa -o auto_cache,reconnect,defer_permissions -o Ciphers=aes128-ctr -o Compression=no maple@123.123.13:123. / 点


小智 5

我发现关闭正在检查 git 文件状态的 zsh 主题有很大帮助 - 仅进入目录就需要 10 分钟以上。同样关闭 Vim 中的 git 状态检查器。