GNU Parallelを使用してrsyncを並列化する


18

rsyncスクリプトを使用して、あるホストのデータを別のホストのデータと同期させています。データには、ほぼ1.2 TBに寄与する多数の小さなサイズのファイルがあります。

これらのファイルを同期するためにrsync、次のコマンドを使用しています。

rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/

proj.lstの内容は次のとおりです。

+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *

テストとして、これらのプロジェクトのうち2つ(8.5GBのデータ)を選択し、上記のコマンドを実行しました。順次プロセスであるため、完了までに14分58秒かかります。したがって、1.2TBのデータの場合、数時間かかります。

複数のrsyncプロセスを並列に実行できる場合(&xargsまたはを使用parallel)、時間を節約できます。

私はparallelcdソースディレクトリにingした後)で以下のコマンドで試しましたが、実行に12分37秒かかりました:

parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .

これは5分の1の時間しかかからなかったはずですが、そうではありませんでした。どこか間違っていると思う。

rsync実行時間を短縮するために複数のプロセスを実行するにはどうすればよいですか?


1
ネットワーク帯域幅によって制限されていますか?ディスクiops?ディスク帯域幅?
オレ丹下

可能であれば、総帯域幅の50%を使用する必要があります。しかし、複数rsyncのを並列化することが最優先事項です。
マンダーシンデ

ネットワーク帯域幅、ディスクIOPS、ディスク帯域幅、および実際に使用されている帯域幅を教えてください。
オレ丹下

実際、上記のパラメーターについては知りません。当分の間、最適化の部分は無視できます。複数rsyncのsが並行して使用されるようになりました。
マンダーシンデ

制限がCPUでない場合、並列化する意味はありません。問題をさらに悪化させる可能性があります(ソースディスクまたはターゲットディスクでディスクアームの動きが競合します)。
ゼノイド

回答:


16

次の手順は私のために仕事をしました:

  1. rsync --dry-run影響を受けるファイルのリストを取得するために、最初を実行します。
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. 次のように、5 秒を並行して実行するために、cat transfer.logto の出力を送りました。parallelrsync
$ cat /tmp/transfer.log | \
    parallel --will-cite -j 5 rsync -avzm --relative \
      --stats --safe-links --ignore-existing \
      --human-readable {} REMOTE-HOST:/data/ > result.log

ここでは、--relativeオプション(link)により、ソースとデスティネーションの影響を受けるファイルのディレクトリ構造が同じ(/data/ディレクトリ内)に維持されるため、コマンドはソースフォルダー(例:)で実行する必要があります/data/projects


5
それはファイルごとにrsyncを行います。splitこれらのファイル名を使用してファイルリスト全体を分割し、それらのファイル名を並列にフィードする方がおそらく効率的です。次に、rsyncを使用--files-fromして各ファイルからファイル名を取得し、同期します。rm backups。* split -l 3000 backup.listバックアップ。ls backups。* | パラレル--line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST:REMOTE_PATH /
Sandip Bhattacharya

1
2番目のrsyncコマンドは、ファイルではないresult.logの行をどのように処理しますか?すなわちreceiving file list ... done created directory /data/
マイクD

1
rsync(3.1.0+)の新しいバージョンでは--info=name、の代わりに使用でき-v、ファイルとディレクトリの名前だけを取得できます。ファイルにスペースやシェルメタキャラクターが含まれている可能性がある場合は、rsyncを転送する「内部」に対して--protect-argsを使用することもできます。
チーター

13

私は個人的にこのシンプルなものを使用しています:

ls -1 | parallel rsync -a {} /destination/directory/

これは、空ではないディレクトリがいくつかある場合にのみ役立ちます。そうしないrsyncと、ほとんどすべての終了ディレクトリがあり、最後のディレクトリがすべてのジョブを単独で実行します。


これはうまく機能します-何をするかわからないので、-vを並列にするとおしゃべりになります。また、並列の-j 30(つまり、rsyncコマンドの前)は、デフォルトのCPUコアごとに1つだけではなく、30個のジョブを実行します。
クリギー

12

誰もが受け入れられた答えを使用することを強くお勧めします。より良い解決策は、トップレベルのディレクトリをクロールし、比例した数のrync操作を起動することです。

大きなzfsボリュームがあり、ソースはcifsマウントでした。両方とも10Gにリンクされており、一部のベンチマークではリンクが飽和する可能性があります。パフォーマンスはを使用して評価されましたzpool iostat 1

ソースドライブは次のようにマウントされました。

mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0

単一のrsyncプロセスを使用する:

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod

ioメーターの読み取り:

StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.61K      0   130M
StoragePod  30.0T   144T      0  1.62K      0   130M

これは、合成ベンチマーク(クリスタルディスク)では、シーケンシャル書き込みのパフォーマンスが900 MB / sに近づくため、リンクが飽和状態になります。130MB / sはあまり良くなく、週末を待つことと2週間待つことの違いです。

そこで、ファイルリストを作成し、同期を再度実行しようとしました(64コアマシンがあります)。

cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log

そして、それは同じパフォーマンスを持っていました!

StoragePod  29.9T   144T      0  1.63K      0   130M
StoragePod  29.9T   144T      0  1.62K      0   130M
StoragePod  29.9T   144T      0  1.56K      0   129M

別の方法として、ルートフォルダでrsyncを実行しました。

rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC
rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell

これにより、実際にパフォーマンスが向上しました。

StoragePod  30.1T   144T     13  3.66K   112K   343M
StoragePod  30.1T   144T     24  5.11K   184K   469M
StoragePod  30.1T   144T     25  4.30K   196K   373M

結論として、@ Sandip Bhattacharyaが提示したように、ディレクトリを取得し、それに並行する小さなスクリプトを作成します。または、ファイルリストをrsyncに渡します。ただし、ファイルごとに新しいインスタンスを作成しないでください。


5

並列化されたrsyncをテストする方法は次のとおりです。http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsyncは優れたツールですが、利用可能な帯域幅がいっぱいにならない場合があります。これは、高速接続を介して複数の大きなファイルをコピーする場合にしばしば問題になります。

以下は、src-dirの大きなファイルごとに、サーバーfooserverのdest-dirに1つのrsyncを開始します。

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{} 

作成されたディレクトリは、間違った権限で終わる可能性があり、小さなファイルは転送されません。これらを修正するには、最後にrsyncを実行します。

rsync -Havessh src-dir/ fooserver:/dest-dir/ 

データをプッシュできないが、それらをプルする必要があり、ファイルがdigits.png(たとえば、000000.png)と呼ばれる場合、あなたはできるかもしれません:

seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/

回避するための他の選択肢はありfindますか?
マンダーシンデ

1
findの-maxdepthを制限します。
オレ丹下

--dry-runオプションを使用するとrsync、転送されるファイルのリストが表示されます。parallelプロセスを並列化するために、そのファイルリストを提供できますか?
マンダーシンデ

1
catファイル| parallel -v ssh fooserver mkdir -p / dest-dir / {//} \; rsync -s -Havessh {} fooserver:/ dest-dir / {}
Ole

そのmkdir -p /dest-dir/{//}\;部分を説明してもらえますか?特に{//}事は少し混乱しています。
マンダーシンデ

1

複数の宛先の同期の場合、私は使用しています

parallel rsync -avi /path/to/source ::: host1: host2: host3:

ヒント:すべてのSSH接続は、公開鍵を使用して確立されます ~/.ssh/authorized_keys


1

常に完全なコマンドを忘れてしまうので、私は常に並列rsyncをグーグルで検索しましたが、私が望んでいた解決策はありませんでした-複数のステップが含まれているか、インストールする必要がありますparallel。私はこのワンライナーを使用して複数のフォルダーを同期することになりました:

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-P 5 生成するプロセスの量です-無制限の場合は0を使用します(明らかに推奨されません)。

--bwlimit すべての帯域幅を使用しないようにします。

-I %findによって提供される引数(にあるディレクトリdir/

$(echo dir/%/ host:/dir/%/)-rsyncによって引数として読み取られるソースおよび宛先ディレクトリを出力します。%はでxargs見つかったディレクトリ名に置き換えられfindます。

/homedir1とに2つのディレクトリがあるとしdir2ます。私は実行しますfind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'。したがって、rsyncコマンドは/home、次の引数を使用して2 つのプロセス(2 つのディレクトリがあるため2つのプロセス)として実行されます。

rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.