web-dev-qa-db-ja.com

rsyncファイルリストの計算を高速化/回避

私はrsync 3.1.1を使用して2つのディスクの同期をとっています。1つはネットワーク上にあり、/mnt/ROUTER_WD_2TB/のsamba共有としてマウントされています。これはソースであり、ネットワークの制限により、速度は最大30〜40MB/sです。もう1つは宛先であり、ローカルにマウントされ(ピーク110MB/s)、/mnt/BACKUP_HITACHI_2TB/です。

次のrsyncコマンドを使用します。

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.

ディスクには多数ファイルが含まれており、そのほとんどは小さいです。

問題は、rsyncに非常に長い時間がかかる(10〜20分)beforeファイルの移動を開始することです。これは、非常に多数の小さなファイルのファイルリストを計算する必要があるためです。この期間中、ファイルの転送速度は約40MB/sですが、新規ワークの使用率は200〜500KB/sと低いです。

通常、rsyncは、最終的にコピーする必要のあるものを見つけるのに約15分かかり、それをコピーするのに5秒かかり、その後、コピーする他のファイルをさらに5分間チェックし続けます。結局のところ、5秒間のファイルコピーは20分間続きます。

フォルダを除外する以外に、ファイルをコピーする前にこの長い期間を回避するために取ることができる手段はありますか? rsyncがすべてのファイルリストを最初から再構築する必要がないように実装できる「キャッシュ」の種類はありますか?

12
AF7

rsyncに関する限り、2つのローカルファイルツリー間でコピーしているため、その最適化(有名なデルタアルゴリズムを含む)のほとんどが無効になります。リモートサーバーでrsyncを実行できる場合(ネットワーク全体で真のクライアントサーバーシナリオが得られる場合)、かなりの牽引力が得られます。

それにもかかわらず、ここに考慮すべき他のオプションがあります

  1. 古いファイルの削除を心配せずにコピーします。これにより、より高速な転送をより頻繁に実行し、遅いクリーンアップを1日1回だけ行うように委任できます。

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. rsyncのデフォルトの削除アルゴリズムのバリエーションを使用して、転送前にファイルの完全なリストを作成しないようにします。

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. トップレベルのディレクトリを別々のタスクに分割し、それらを並行して実行します。ディスクがIOにバインドされている場合、これは実際には効果がなく、回転盤では、ほぼ確実に事態が悪化することがあります。

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    

これらの提案のいずれも役に立たない場合は、rsyncに別の--verboseを追加して、それが何をしているかを確認することをお勧めします。変更されていないすべてのファイルを処理していると思います。十分なファイルがある場合、これには単に長い時間がかかります。

5
roaima