web-dev-qa-db-ja.com

ハードリンクを使用するバックアップを間引く最も効率的な方法

異なる日付の同じマシンの何百ものバックアップを含むバックアップディスクがあります。バックアップはrsyncとハードリンクを使用して作成されました。つまり、ファイルが変更されない場合、バックアップスクリプトは、古いバックアップのファイルへのハードリンクを作成するだけです。したがって、ファイルが変更されない場合は、バックアップディスクに基本的に1つのコピーがありますが、各ディレクトリに各日付のバックアップを表す100個のハードリンクがあります(たとえば、back-1back-2、... back-n)。間引く場合は、すべてではなく一部を削除します。 back_5back_6、... back_10を削除したいとします(例として、私の実際のシナリオにはもっとたくさんあります)。それから私はそれを次の方法で麻痺させようとします:

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

これには数時間かかります。それで、これを行うためのより速い方法はありますか?

4
student

このようにxargsを使用するのがいかに遅いかはわかりません。私のマンページには、-Pはプロセスの数、-nは引数の数と書かれています。 -P0には特別な値がないため、無視される可能性があります(または、名誉を与えられた場合、プロセスがゼロになり、24時間何も説明されません!)。また、-n1を使用すると、ファイル名ごとに1つexec(2)を取得できます。これは、可能な限り最も遅い速度です。

この作業を並列化することで多くのことを購入できるとは思えません。私はただ思うだろう

$ echo filenames ... | xargs rm -rf 

十分でしょう。必要に応じて、-P4のような値を試すことができます。コマンドライン引数の数をnot制限することにより、/bin/rmの呼び出しを最小限に抑え、ディスクキャッシュを順番に処理できるようにします。

1
James K. Lowden

比較的小さいディレクトリをほとんど削除しているため、dfは少数を報告しています。また、ファイルシステムによっては、ディレクトリへの変更やファイルへのリンク数の変更は、障害回復に不可欠であるため、すぐにジャーナルに記録されたり、ディスクに同期されたりします。

それは実際にあなたのリンクの効率の証拠です!

0
stolenmoment

私の経験では、rsync + hardlinkベースのバックアップを高速化する最良の方法は、ファイルの数を減らすことでした。

小さなファイルが多数あると、rsyncが遅くなりますたくさん

ほとんどが小さいファイルで、ほとんどが読み取り専用のディレクトリがtarredされるようにデータを整理できる場合は、バックアップスクリプトの速度が大幅に向上するはずです。 (archivemountなどのツールを使用すると、アーカイブを抽出せずにそれらのアーカイブにアクセスできます)。

バックアップスクリプトを並列化しても、おそらく役に立たないか、速度が低下する可能性があります(予測可能なディスクアクセスの方が最適です)。

0
PSkocik

これは、ハードデータによってバックアップされるというよりも、経験に基づく応答でもあります。

クロスリンクが多い同様のツリー内の多くのファイルを削除する場合、分離されたサブツリーを並行して削除する方が速いように思われることがわかりました。図を使って説明してみましょう。

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

topdir1topdir2topdir3を並行して削除するよりも、a1b1c1を並行して削除する方が速いという印象があります。次に、a2b2c2などに移動します。 (これに関する私の理論は、「同じ」ファイルの複数の並列リンク解除により、iノードリンク参照カウントの競合が発生するというものですが、ハードデータでこれを確認していないことを強調します。)

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