在 NFS 共享中復製文件是否涉及網路?
我假設以下方法可以在 NFS 共享中復製文件:
過程1:
- 客戶端請求從 NFS 共享複製數據(如果不存在記憶體),並且數據塊被非同步複製到 NFS 客戶端的記憶體中,然後 NFS 客戶端再次非同步將其發送到 NFS 文件管理器以復製到新位置。
- NFS 文件管理器非同步接收記憶體中的數據塊並將其寫入新位置。
- 在這個過程中,雖然讀寫都涉及到網路,但由於非同步讀寫,一次整體讀寫操作的延遲將與整體數據的讀寫操作延遲相同。
因此,從本地硬碟讀取並寫入 NFS 與從 NFS 讀取和寫入 NFS 幾乎相同。
第一步,如果記憶體已經存在,讀取速度會非常快。
過程2:
- 客戶端向 NFS 伺服器發送請求以啟動數據複製操作,以及它必須讀取和寫入的位置(似乎不是)。
- 伺服器使用自己的記憶體完成其餘的讀寫操作。
因此,不涉及網路。因此,可以有更好的性能(除非在網路端沒有延遲)但它可能不是這樣。
如果我錯了,請隨時糾正我。
另外,記憶體是否涉及每個操作,我的意思是當它通過網路發送數據時,數據首先從磁碟發送到記憶體(數據緩衝區),然後從記憶體(數據緩衝區)發送到數據緩衝區(在另一側)網路),但不是從數據緩衝區到網路另一端的磁碟,對嗎?
NFSv4.2 確實有一個解除安裝複製操作,它可以在不通過客戶端代理數據的情況下進行伺服器到伺服器的複制。現代 linux 核心(> 3.13?)支持這一點。我不知道其他伺服器。
更新
linux伺服器不支持linux核心4.7伺服器端複製 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs/nfsd/nfs4xdr.c?id=refs /tags/v4.7-rc6#n1797
該
"copy a file"
操作不是基本的文件系統操作,例如read
、write
、open
、close
和類似操作。有關文件系統必須支持的操作的詳細說明,請參閱此頁面。這就是所有文件系統 - 無論是
ext4
、btrfs
還是nfsv4
.請注意,沒有辦法知道為什麼一個程序打開文件 A,打開文件 B,從文件 A 讀取,然後寫入文件 B。所以,一般來說,沒有辦法“短路”和優化文件的複制,所以在文件 A 和文件 B 都在 NFS 文件系統上的情況下,數據不必通過網路兩次,即使它們是從同一個 NFS 伺服器共享的。
許多作業系統確實提供系統呼叫,如
sendfile()
必須是與操作類似的限制rename()
——這種假設的copyfile()
操作可能必須限制為僅短路單個文件系統中的那些副本。否則會造成複雜的混亂 - 如果文件 A 和文件 B 在同一個 NFS 伺服器上,客戶端想要從一個複製到另一個,但文件 A 在 ext4 文件系統上,而文件 B 在上,該怎麼辦另一個 XFS 文件系統?