異なる日付の同じマシンの何百ものバックアップを含むバックアップディスクがあります。バックアップは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
これには数時間かかります。それで、これを行うためのより速い方法はありますか?
このようにxargsを使用するのがいかに遅いかはわかりません。私のマンページには、-Pはプロセスの数、-nは引数の数と書かれています。 -P0
には特別な値がないため、無視される可能性があります(または、名誉を与えられた場合、プロセスがゼロになり、24時間何も説明されません!)。また、-n1
を使用すると、ファイル名ごとに1つexec(2)を取得できます。これは、可能な限り最も遅い速度です。
この作業を並列化することで多くのことを購入できるとは思えません。私はただ思うだろう
$ echo filenames ... | xargs rm -rf
十分でしょう。必要に応じて、-P4
のような値を試すことができます。コマンドライン引数の数をnot制限することにより、/bin/rm
の呼び出しを最小限に抑え、ディスクキャッシュを順番に処理できるようにします。
比較的小さいディレクトリをほとんど削除しているため、dfは少数を報告しています。また、ファイルシステムによっては、ディレクトリへの変更やファイルへのリンク数の変更は、障害回復に不可欠であるため、すぐにジャーナルに記録されたり、ディスクに同期されたりします。
それは実際にあなたのリンクの効率の証拠です!
私の経験では、rsync + hardlinkベースのバックアップを高速化する最良の方法は、ファイルの数を減らすことでした。
小さなファイルが多数あると、rsyncが遅くなりますたくさん。
ほとんどが小さいファイルで、ほとんどが読み取り専用のディレクトリがtar
redされるようにデータを整理できる場合は、バックアップスクリプトの速度が大幅に向上するはずです。 (archivemount
などのツールを使用すると、アーカイブを抽出せずにそれらのアーカイブにアクセスできます)。
バックアップスクリプトを並列化しても、おそらく役に立たないか、速度が低下する可能性があります(予測可能なディスクアクセスの方が最適です)。
これは、ハードデータによってバックアップされるというよりも、経験に基づく応答でもあります。
クロスリンクが多い同様のツリー内の多くのファイルを削除する場合、分離されたサブツリーを並行して削除する方が速いように思われることがわかりました。図を使って説明してみましょう。
topdir1
|-a1
|-b1
|-c1
topdir2
|-a2
|-b2
|-c2
topdir3
|-a3
|-b3
|-c3
topdir1
、topdir2
、topdir3
を並行して削除するよりも、a1
、b1
、c1
を並行して削除する方が速いという印象があります。次に、a2
、b2
、c2
などに移動します。 (これに関する私の理論は、「同じ」ファイルの複数の並列リンク解除により、iノードリンク参照カウントの競合が発生するというものですが、ハードデータでこれを確認していないことを強調します。)
for topdir in *
do
echo "Removing $topdir..."
for sub in "$topdir"/*; do rm -rf "$sub" & done
wait
rm -rf "$topdir"
done