Answers:
当然,ssh更好。
Nfs使用具有各种远程过程调用和数据同步等待时间的复杂网络协议。对于ssh,这些不适用。
此外,还有许多锁。nfs中的文件删除以这种方式工作:
rm
命令给出了unlink()
系统调用unlink()
呼叫unlink()
在远程执行此调用unlink()
原始调用的退出代码0rm
rm
迭代到下一个文件,转到1现在,重要的是:2-7之间,rm
必须等待。它可以unlink()
异步发送下一个调用,但是它是单线程的,不是面向事件的工具。即使可以,它仍然需要棘手的nfs安装标志。直到没有得到结果,它才会等待。
Nfs-以及任何网络文件系统-总是慢得多。
在许多情况下,您可以使用技巧来以近似无限的速度进行递归删除:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)从许多(但不是全部)方面来看,该目录删除看起来好像实际上是在零时间发生的。
扩展名:正如@ el.pascado在他的出色评论中提到的,实际上2-7必须为任何文件运行3倍:
lstat()
syscall),unlink()
在目录的情况下,opendir()
,删除所有文件/文件在其目录递归,然后closedir()
,终于rmdir()
。readdir()
调用迭代到下一个目录条目。这需要3个nfs RPC命令来存储文件,另外3个用于目录。
是。也许。这取决于。对于少量文件和目录,不会有太大区别。
在NFS挂载的目录上批量执行文件操作很慢。如果您有机会登录NFS服务器本身并在实际目录中进行操作,则速度会更快。
让我们通过从CVS中检出并通过NFS挂载的OpenBSD ports集合来测试它:
在NFS服务器上:
$ cd /export/shared/ports
$ du -hs .
2.6G .
$ find . | wc -l
179688
$ time rm -rf /export/shared/ports/*
0m20.87s real 0m00.12s user 0m04.62s system
在客户端上(从备份还原原始文件之后):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
标志,rm
必须首先检查文件是否是目录(lstat
通过nfs),打开文件(opendir
通过nfs),读取其内容(readdir
通过nfs),然后才按照答案中所述对在内部和内部找到的每个文件执行实际删除操作。递归到子目录,关闭目录(closedir
通过nfs),然后对找到的每个目录重复执行。