Nfs

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

  • August 31, 2017

在對目錄進行操作之前登錄具有該目錄的機器rm -rf,還是僅rm -rf通過 NFS 登錄目錄,是否會在時間上有很大差異?

當然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()系統呼叫),
  • 然後做相應的事情。在普通文件unlink()的情況下,在目錄的情況下,opendir()遞歸刪除其中的所有文件/目錄,然後closedir(),最後rmdir()
  • 最後,通過呼叫迭代到下一個目錄條目readdir()

這需要 3 個用於文件的 nfs RPC 命令,以及另外 3 個用於目錄的命令。

引用自:https://unix.stackexchange.com/questions/389456