同じマシンの異なる日付のバックアップが何百個も含まれているバックアップ ディスクがあります。バックアップは rsync とハードリンクを使用して作成されました。つまり、ファイルが変更されていない場合、バックアップ スクリプトは古いバックアップ内のファイルへのハードリンクを作成します。したがって、ファイルが変更されていない場合は、バックアップ ディスクには基本的に 1 つのコピーがありますが、各日付のバックアップを表す各ディレクトリに 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
どのように使っているのかわかりませんxargsこの方法は、決して遅いわけではありません。私のマニュアルページには、-P はプロセス数、-n は引数の数と書かれています。 には特別な値はないので、おそらく無視されます (または、尊重された場合、プロセスがゼロになり、24 時間何も起こらないことになります-P0
)。そして、-n1
実行者(2)ファイル名ごとに、これが最も遅い方法です。
この作業を並列化してもあまり意味がないと思う。
$ echo filenames ... | xargs rm -rf
で十分です。-P4
必要に応じて、次のような値を試すこともできます。ないコマンドライン引数の数を制限すると、の呼び出しが最小限に抑えられ/bin/rm
、ディスク キャッシュを介して順番に処理が実行されます。
答え2
df が小さい数値を報告しているのは、主に比較的小さいディレクトリを削除しているためです。また、ファイルシステムによっては、ディレクトリの変更やファイルへのリンク数の変更が、障害回復に重要であるため、すぐにジャーナル化され、ディスクに同期されるため、速度が遅くなります。
それは実際にリンクの効率性の証拠です!
答え3
私の経験では、rsync + ハードリンク ベースのバックアップを高速化する最善の方法は、ファイルの数を減らすことです。
多数の小さなファイルがあると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