NFS 在高延遲下的性能很差,rsync over ssh 大約快 100 倍
我們正在使用 rsync 從兩個 NFS 伺服器同步數據。一台 NFS 伺服器在東海岸,另一台在西海岸。RTT 約為 110 毫秒。
在東海岸 NFS 伺服器上,我安裝了西海岸 NFS 伺服器安裝點。
<server>:/home/backups on /mnt/backups type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5,clientaddr=x.x.x.x,local_lock=none,addr=y.y.y.y)
.數據已經在兩台伺服器上,只是為了驗證數據(例如同步文件夾和什麼時候不需要更改)。以下是驗證東海岸伺服器與 7GB 文件夾的西成本伺服器相同所需的時間。
以下大約需要 8 分鐘才能完成超過 7GB 的數據。
rsync -r -vvvv --info=progress2 --size-only /<local_path>/ /<remote_path>/
以下(避免使用 NFS 掛載)大約需要 15 秒才能完成超過 7GB 的數據(同上)。
rsync -r -vvvv --info=progress2 --size-only /<local_path>/ <user>@<west_cost_NFS>:/<remote_path>/
由於文件夾已經同步,上面再次沒有移動任何數據,它只是驗證數據是相同的(基於文件的大小)。
我試過
-o async
在客戶端和伺服器上使用,但是當我在客戶端上執行“掛載”時,客戶/etc/exports
async
端永遠不會顯示。async
我假設async
是預設的。我嘗試將 rsize、wsize 也更改為更大的值,但性能並沒有變得更好。我只是想從 NFS 中獲得更好的性能嗎?
在我看來,您試圖錯誤地使用 rsync。Rsync 的協議專為在兩個單獨的伺服器上比較/同步大型文件系統的確切場景而設計。在進行中間比較之前,它在本地和遠端機器上都可以在本地完成。
它的協議被設計成一台機器上的 rsync 代理與另一台機器上的 rsync 代理對話,並且該協議旨在大量減少完成任務所需的往返次數(和總數據)。
那就是 rsync 旨在工作:
[fast] [slow SSH] [fast] File system <----> rsync <----------> rsync <----> File system
Rsync 針對兩個代理之間的網路性能進行了優化,但它無法控制用於訪問磁碟的協議。因此,當您掛載遠端 NFS 文件系統時,您會更改網路訪問配置文件:
[fast] [fast] [slow NFS] File system <----> rsync <------> rsync <---------> File system
Rsync 對此無能為力,因為它完全無法控制 NFS 協議。
這裡的一個具體區別是,通過 NFS,必須單獨請求每個文件。要探索包含
/foo/bar/baz
您必須請求的文件樹/
$$ wait $$然後請求
/foo
$$ wait $$然後請求/foo/bar
$$ wait $$然後最後請求/foo/bar/baz
。每個請求有 110 毫秒的延遲,即 330 毫秒的延遲,而您只有一個文件。 代理之間的 Rsync 協議沒有這個限制。在遠端機器上執行的代理急切地編譯遠端文件系統中正在同步的每個文件和目錄的列表,並發送所有內容。整個文件樹只有一個請求!