透過 SSH 進行 Rsync 傳輸非常慢

透過 SSH 進行 Rsync 傳輸非常慢

我正在對我的網站進行遠端備份。整個目錄約70GB,總共約5,000,000個檔案。這是我在備份伺服器上運行的命令:

rsync -ah -e ssh --delete --link-dest=/backups/2013.09.06 [email protected]:/var/www/backups/2013.09.07

進程運行超過 48 小時且掛起。

我已經strace -p在客戶端(網站所在的網頁伺服器)上運行了 rsync 進程,並看到該進程在一段時間後定期select以命令結尾處停止,然後繼續。= 0 (Timeout)

open("mysite/files/1694201", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=10083, ...}) = 0
read(3, "\r\n\320\224\320\265\321\201\321\217\321\202\321\214 \320\273\320\265\321\202, \321\210\320\265\321\201\321\202\321"..., 10083) = 10083
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999998})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\320\260\320\262\320\260\320\271\321\202\320\265...\320\232\320\270\320\264\320\260\320\271\321\202\320\265 \320\274"..., 4092) = 4092
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 0 (Timeout)

進程在最後一行掛起一分鐘左右。

為什麼會發生這種情況?為什麼這個過程需要這麼長時間並且永遠無法結束?0 (Timeout)strace 中的那些是什麼意思?

兩台伺服器都運行rsync 3.0.9,IO沒有過載。

答案1

strace 中的 0(超時)是什麼意思?

去讀第五個參數傳遞給選擇

顯然,rsync(單獨)不適合您選擇的備份檔案的方法。它必須為 500 萬個檔案中的每個檔案產生一個雜湊值,並將其透過網路發送,以查找是否有任何變更。

如果是我,我會將其包裝在來源伺服器上運行的腳本中

  1. 檢查上次成功同步的開始時間 (tstart)

  2. 尋找來源上所有具有 mtime > tstart 的文件

  3. rsync那些修改的檔案到備份伺服器

例如

#!/bin/bash

touch newrun
find /var/www -newer lastrun -exec rsync ....
rm -f lastrun
mv newrun lastrun

答案2

你確定你有 50 億個文件嗎?

我寧願使用 tgz 和 rsync 那個 tgz,因為如果您有某種「正常」的硬碟,沒有高速 SAN 或 SSD,從 src 到 dst 的初始比較將花費很長時間。

你的進程在哪裡慢?在檔案傳輸期間或初始 src<->dst 期間 - 檢查?

如果可能的話,我會檢查兩端的 IOWAIT。並且,如果機器有 md-raid,cat /proc/mdstatus。非常糟糕的 io 性能可能是重建 raid 的結果(但可能性很小)。

我會在 rsync 傳輸期間打開單個大型檔案進行傳輸--progress以檢查網路速度。

偵錯提示(您應該測試每個可能的瓶頸,甚至只是為了確保:這不是問題)

  • 嘗試使用 -avzh --progress --stats 進行 rsync
  • 本地 io 效能
  • 網路效能
  • hd/raid-status (SMART),檢查有故障的硬體

相關內容