在对目录执行操作之前登录到具有该目录的计算机rm -rf
,或者只是rm -rf
通过 NFS 登录目录,时间上会有很大差异吗?
答案1
当然ssh更好。
Nfs使用复杂的网络协议,具有各种远程过程调用和数据同步等待时间。对于 ssh,这些不适用。
此外,还有很多锁。 nfs 中的文件删除是这样进行的:
- 你的
rm
命令给出了unlink()
系统调用 - nfs 驱动程序将其转换为 sunrpc 请求,并将其发送到 nfs 服务器
- nfs 服务器将此 sunrpc 请求转换回
unlink()
调用 unlink()
在远程端执行此调用- 成功后,向客户端返回相当于“好吧,完成”的rpc回复消息
- 客户端的内核驱动程序将其转换回
unlink()
原始调用的退出代码 0rm
rm
迭代到下一个文件,转到 1
现在,重要的是:2-7点之间,rm
必须等待。它可以异步发送下一个unlink()
调用,但它是单线程的,不是面向事件的工具。即使可以,它仍然需要棘手的 nfs 挂载标志。直到没有得到结果,它才会等待。
Nfs - 以及任何网络文件系统 - 总是慢得多。
在许多情况下,您可以通过一个技巧使递归删除达到准无限的速度:
- 首先将目录移动到不同的名称 (
mv -vf oldfilms oldfilms-
) - 在后台删除 (
rm -rf oldfilms- &
)
从许多(但不是全部)方面来看,此目录删除看起来好像是在几乎零时间内发生的。
扩大:正如 @el.pascado 在他的精彩评论中提到的,实际上 2-7 必须运行3x对于任何文件:
- 确定它是文件还是目录(使用
lstat()
系统调用), - 然后做相应的事情。对于普通文件,
unlink()
,对于目录,opendir()
,递归删除其中的所有文件/目录,然后closedir()
,最后rmdir()
。 - 最后,通过调用迭代到下一个目录条目
readdir()
。
对于文件,它需要 3 个 nfs RPC 命令,对于目录还需要 3 个命令。
答案2
是的。也许。这取决于。对于少量文件和目录,它不会有太大区别。
在 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