为何在sshfs挂载目录下执行find或ls能大幅提升rsync的执行速度?
为何在sshfs挂载目录下执行find或ls能大幅提升rsync的执行速度?
嘿,这个现象其实是sshfs的缓存机制在起作用,我给你掰扯清楚来龙去脉:
先还原下你的场景:你用sshfs把只支持SFTP的远程服务器挂载到本地,第一次rsync传完16k个文件后,再跑同步命令居然花了90秒——明明没新增文件,按说应该秒完成对吧?但只要先跑一遍find "$MNT_DIR" >/dev/null或者ls,再执行rsync就快到0.1秒了,是不是特别神奇?
核心原因:sshfs的元数据缓存逻辑
sshfs是基于SFTP协议的用户态文件系统,它默认不会主动缓存远程目录的结构和文件元数据(比如修改时间、文件大小、权限这些)。当你直接跑rsync的时候,rsync需要遍历整个远程挂载目录的文件树,逐一对比本地和远程的文件信息。每访问一个文件或目录,sshfs都得通过SFTP协议给远程服务器发请求,拿到对应的元数据后再返回给rsync。16k个文件的话,就是16k次网络请求,叠加起来的延迟直接把时间拉到了90秒。
而当你先执行find或者ls命令时,这两个命令会完整遍历一遍挂载目录的所有内容。在这个过程中,sshfs会把获取到的远程文件元数据自动缓存到本地内存里。等rsync再启动时,它需要的大部分文件元数据都能直接从本地缓存读取,不用再反复发起远程SFTP请求了,速度自然就大幅提升。
额外说明
这种缓存是临时的,会随着时间推移、sshfs连接的闲置,或者某些文件操作(比如远程服务器上的文件被修改)而失效。如果之后rsync又变慢了,再提前跑一遍find或者ls就能重新触发缓存,让rsync再次“起飞”。
附上你提到的相关命令:
- 挂载远程目录的命令(顺手修正了原命令的逻辑错误,避免挂载成功也输出错误信息):
sshfs $USER@$HOST:/ "$MNT_DIR" -o IdentityFile=$idfile || (echo "Error: Could not mount" && exit 1)
- 原本慢到离谱的rsync命令:
rsync -v --recursive --times --itemize-changes --exclude '*~' $LOCAL_DIR "$MNT_DIR"
- 触发缓存的find命令:
find "$MNT_DIR" >/dev/null # 1 second
备注:内容来源于stack exchange,提问作者mgutt
相关产品推荐
相关产品推荐

