同じコンピュータに対して、異なる日付の何百ものバックアップを含むバックアップディスクがあります。バックアップは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 +ハードリンクベースのバックアップを高速化する最善の方法は、保持しているファイルの数を減らすことです。
小さなファイルが多いと、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