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

ste*_*km3 10 performance nfs

rm -rf在对目录或仅rm -rf通过 NFS的目录进行操作之前,先登录具有该目录的机器在时间上会有很大的不同吗?

pet*_*erh 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 必须为任何文件运行3x

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

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

  • nfs 的情况更糟。当问题提到`-r`标志时,`rm`必须首先检查文件是否是一个目录(通过nfs的`lstat`),打开它(通过nfs的`opendir`),读取它的内容(通过nfs的`readdir`),然后才对在内部找到的每个文件执行实际删除,并递归到子目录中,关闭目录(通过 nfs 关闭目录),然后对每个找到的目录重复。 (2认同)

Kus*_*nda 5

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

在 NFS 挂载目录上批量执行文件操作很慢。如果您有机会登录到 NFS 服务器本身并在实际目录上执行这些操作,那么这会更快。

让我们通过删除我从 CVS 检出并安装在 NFS 上的 OpenBSD 端口集合来测试它:

在 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
Run Code Online (Sandbox Code Playgroud)

在客户端上(从备份恢复原始文件后):

$ time rm -rf /usr/ports/*
6m49.73s real     0m01.55s user     1m08.96s system
Run Code Online (Sandbox Code Playgroud)