Linux

為什麼 rsync 比 NFS 快?

  • October 7, 2014

幾天前,我注意到一些很奇怪的事情(至少對我來說)。我執行 rsync 複製相同的數據,然後將其刪除到 NFS 掛載,稱為/nfs_mount/TEST. 這/nfs_mount/TEST是託管/導出的nfs_server-eth1。兩個網路介面上的 MTU 都是 9000,中間的交換機也支持巨型幀。如果我這樣做,rsync -av dir /nfs_mount/TEST/我將獲得 X MBps 的網路傳輸速度。如果我這樣做,rsync -av dir nfs_server-eth1:/nfs_mount/TEST/我將獲得至少 2X MBps 的網路傳輸速度。我的 NFS 掛載選項是nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

底線:兩次傳輸都通過相同的網路子網、相同的線路、相同的介面、讀取相同的數據、寫入相同的目錄等。唯一的區別是通過 NFSv3,另一個通過 rsync。

客戶端是 Ubuntu 10.04,伺服器是 Ubuntu 9.10。

rsync 怎麼這麼快?如何使 NFS 與該速度相匹配?

謝謝

編輯:請注意我使用 rsync 寫入 NFS 共享或 SSH 到 NFS 伺服器並在本地寫入。兩次我都這樣做rsync -av,從明確的目標目錄開始。明天我將嘗試使用普通副本。

Edit2(附加資訊):文件大小範圍為 1KB-15MB。文件已經壓縮,我嘗試進一步壓縮它們但沒有成功。我tar.gz從中製作了文件dir。這是模式:

  • rsync -av dir /nfs_mount/TEST/= 最慢的傳輸;
  • rsync -av dir nfs_server-eth1:/nfs_mount/TEST/= 啟用巨型幀的最快 rsync;沒有巨型幀會慢一點,但仍然比直接連接到 NFS 快得多;
  • rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/= 與其非 tar.gz 等效項大致相同;

cp使用和進行測試scp

  • cp -r dir /nfs_mount/TEST/= 比 略快rsync -av dir /nfs_mount/TEST/但仍明顯慢於rsync -av dir nfs_server-eth1:/nfs_mount/TEST/.
  • scp -r dir /nfs_mount/TEST/= 整體最快,略勝一籌rsync -av dir nfs_server-eth1:/nfs_mount/TEST/
  • scp -r dir.tar.gz /nfs_mount/TEST/= 與其非 tar.gz 等效項大致相同;

結論,基於此結果:對於此測試,如果使用 tar.gz 大文件或許多小文件,則沒有顯著差異。開啟或關閉巨型幀也幾乎沒有區別。cp並且scp比它們各自的rsync -av同類產品更快。無論使用何種方法,直接寫入導出的 NFS 共享比通過 SSH 寫入同一目錄要慢得多(至少 2 倍)。

cp在這種情況下,和之間的差異rsync不相關。我決定嘗試一下cpscp看看它們是否顯示相同的模式並且它們確實 - 2X 差異。

在我使用rsynccp在這兩種情況下,我無法理解是什麼阻止了 NFS 通過 SSH 達到相同命令的傳輸速度。

為什麼寫入 NFS 共享比通過 SSH 寫入同一位置慢 2 倍?

Edit3(NFS 伺服器 /etc/exports 選項)rw,no_root_squash,no_subtree_check,sync:. 客戶端的 /proc/mounts 顯示:nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

謝謝你們!

也許不是傳輸速度變慢,而是寫入延遲增加。嘗試安裝 NFS 共享非同步而不是同步,看看是否可以縮小速度差距。當您通過 ssh 進行 rsync 時,遠端 rsync 程序非同步(快速)寫入。但是當寫入同步掛載的 nfs 共享時,寫入不會立即得到確認:NFS 伺服器會等到它們命中磁碟(或更可能是控制器記憶體),然後才會向 NFS 客戶端發送寫入成功的確認資訊。

如果“非同步”解決了您的問題,請注意,如果 NFS 伺服器在寫入過程中出現問題,您很可能最終會在磁碟上出現不一致的數據。只要此 NFS 掛載不是此(或任何其他)數據的主記憶體儲,您可能就可以了。當然,如果您在 rsync-over-ssh 執行期間/之後拔下 nfs 伺服器上的外掛,您將處於同一條船上(例如,rsync 返回“完成”,nfs 伺服器崩潰,寫入記憶體中未送出的數據現在失去了在磁碟上留下不一致的數據)。

儘管您的測試(rsyncing 新數據)不是問題,但請注意,在計算校驗和並生成需要的文件列表時,在傳輸單個字節之前,通過 ssh 進行 rsync 會對遠端伺服器產生大量 CPU 和 IO 需求更新。

引用自:https://serverfault.com/questions/268369