Nfs
最好使用本地執行 rm -rf 而不是通過 nfs?
在對目錄進行操作之前登錄具有該目錄的機器
rm -rf
,還是僅rm -rf
通過 NFS 登錄目錄,是否會在時間上有很大差異?
當然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 必須為任何文件執行3 倍:
- 確定它是文件還是目錄(使用
lstat()
系統呼叫),- 然後做相應的事情。在普通文件
unlink()
的情況下,在目錄的情況下,opendir()
遞歸刪除其中的所有文件/目錄,然後closedir()
,最後rmdir()
。- 最後,通過呼叫迭代到下一個目錄條目
readdir()
。這需要 3 個用於文件的 nfs RPC 命令,以及另外 3 個用於目錄的命令。