使用硬連結來精簡備份的最有效方法

使用硬連結來精簡備份的最有效方法

我有一個備份磁碟,其中包含同一台電腦不同日期的數百個備份。備份是使用 rsync 和硬連結進行的,即如果檔案沒有更改,則備份腳本只會在舊備份中建立指向該檔案的硬連結。因此,如果一個檔案永遠不會更改,那麼您在備份磁碟中基本上擁有一份副本,但在每個目錄中都有 100 個指向該檔案的硬鏈接,代表每個日期的備份(例如back-1, back-2, .... back-n)。如果我想精簡它,我會刪除其中的一部分,但不是全部。假設我想刪除back_5, back_6, ... back_10(僅作為示例,在我的真實場景中還有更多)。然後我嘗試透過以下方式將其並行化:

echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf

這需要幾個小時。那麼有沒有更快的方法來做到這一點呢?

答案1

我看不到你如何使用參數這樣一點也不慢。我的線上幫助頁顯示 -P 是進程數,-n 是參數數。沒有特殊值-P0,因此可能會被忽略(或者,如果榮幸的話,您將獲得零個進程,這將解釋 24 小時什麼都沒有!)。並-n1確保您得到一個執行(2) 對於每個檔案名,這大約是最慢的。

我懷疑並行這項工作會為你帶來很多好處。我會想只是

$ echo filenames ... | xargs rm -rf 

就足夠了。-P4如果你願意的話,你可以嘗試一些值。經過不是限制命令列參數的數量,可以最大限度地減少呼叫/bin/rm並讓它通過磁碟快取串行進行。

答案2

df 報告的數字較小,因為您主要刪除相對較小的目錄。此外,根據檔案系統,對目錄的變更和對檔案連結數量的變更會立即記錄和/或同步到磁碟,因為它們對於故障復原至關重要,因此速度較慢。

這實際上證明了您的連結效率!

答案3

根據我的經驗,加速基於 rsync+hardlink 的備份的最佳方法是減少您擁有的檔案數量。

大量小檔案導致rsync變慢很多

如果您可以以這樣的方式組織數據,以便您的大部分小文件、大部分只讀目錄變紅tar,您應該會看到備份腳本的速度顯著提高。 (使用諸如 之類的工具archivemount,您可以存取這些檔案而無需解壓縮它們)。

並行化備份腳本可能不會有幫助,甚至可能會減慢備份腳本的速度(可預測的磁碟存取更為最佳化)。

答案4

這也是一種基於經驗的回應,而不是由硬數據支援的回應。

我發現,當刪除具有大量交叉連結的類似樹中的許多檔案時,並行刪除孤立的子樹似乎更快。讓我試著用圖來解釋:

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

我的印像是,並行刪除, ,然後繼續刪除, , ,比並行刪除topdir1, topdir2,更快。 (我對此的理論是,「相同」檔案的多個並行取消連結會導致 inode 連結引用計數的爭用,但我強調我還沒有用硬數據檢查這一點。)topdir3a1b1c1a2b2c2

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done

相關內容