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


10

在对目录进行登录之前rm -rf(或者仅rm -rf通过NFS进行目录登录),登录到具有该目录的计算机上的时间会有很大差异吗?

Answers:


11

当然,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必须为任何文件运行3倍

  • 确定它是文件还是目录(使用lstat()syscall),
  • 然后做相应的。在普通文件的情况下,unlink()在目录的情况下,opendir(),删除所有文件/文件在其目录递归,然后closedir(),终于rmdir()
  • 最后,通过readdir()调用迭代到下一个目录条目。

这需要3个nfs RPC命令来存储文件,另外3个用于目录。


2
nfs的情况更糟。正如问题提到的-r标志,rm必须首先检查文件是否是目录(lstat通过nfs),打开文件(opendir通过nfs),读取其内容(readdir通过nfs),然后才按照答案中所述对在内部和内部找到的每个文件执行实际删除操作。递归到子目录,关闭目录(closedir通过nfs),然后对找到的每个目录重复执行。
el.pescado

5

是。也许。这取决于。对于少量文件和目录,不会有太大区别。

在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.