我有一個備份磁碟,其中包含同一台電腦不同日期的數百個備份。備份是使用 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 連結引用計數的爭用,但我強調我還沒有用硬數據檢查這一點。)topdir3
a1
b1
c1
a2
b2
c2
for topdir in *
do
echo "Removing $topdir..."
for sub in "$topdir"/*; do rm -rf "$sub" & done
wait
rm -rf "$topdir"
done