我正在對我的網站進行遠端備份。整個目錄約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 萬個檔案中的每個檔案產生一個雜湊值,並將其透過網路發送,以查找是否有任何變更。
如果是我,我會將其包裝在來源伺服器上運行的腳本中
檢查上次成功同步的開始時間 (tstart)
尋找來源上所有具有 mtime > tstart 的文件
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),檢查有故障的硬體