最好使用本地运行 rm -rf 而不是通过 nfs?

最好使用本地运行 rm -rf 而不是通过 nfs?

在对目录执行操作之前登录到具有该目录的计算机rm -rf,或者只是rm -rf通过 NFS 登录目录,时间上会有很大差异吗?

答案1

当然ssh更好。

Nfs使用复杂的网络协议,具有各种远程过程调用和数据同步等待时间。对于 ssh,这些不适用。

此外,还有很多锁。 nfs 中的文件删除是这样进行的:

  1. 你的rm命令给出了unlink()系统调用
  2. nfs 驱动程序将其转换为 sunrpc 请求,并将其发送到 nfs 服务器
  3. nfs 服务器将此 sunrpc 请求转换回unlink()调用
  4. unlink()在远程端执行此调用
  5. 成功后,向客户端返回相当于“好吧,完成”的rpc回复消息
  6. 客户端的内核驱动程序将其转换回unlink()原始调用的退出代码 0rm
  7. rm迭代到下一个文件,转到 1

现在,重要的是:2-7点之间,rm必须等待。它可以异步发送下一个unlink()调用,但它是单线程的,不是面向事件的工具。即使可以,它仍然需要棘手的 nfs 挂载标志。直到没有得到结果,它才会等待。

Nfs - 以及任何网络文件系统 - 总是慢得多。


在许多情况下,您可以通过一个技巧使递归删除达到准无限的速度:

  1. 首先将目录移动到不同的名称 ( mv -vf oldfilms oldfilms-)
  2. 在后台删除 ( 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

相关内容