GNU Parallelを使用したrsyncの並列化

GNU Parallelを使用したrsyncの並列化

rsync私はあるホストのデータを別のホストのデータと同期させるためにスクリプトを使用してきました。データには、合計1.2TBに達する多数の小さなファイルが含まれています。

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ソースディレクトリに移動した後)次のコマンドを試してみました。実行時間は12分37秒でした。

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

これは時間を5倍短縮するはずですが、そうではありません。私はどこか間違っていると思いました。

rsync実行時間を短縮するために複数のプロセスを実行する方法は?

答え1

私は誰にも許可された答えを使用しないことを強くお勧めします。より良い解決策は、トップレベルのディレクトリをつかみ、特定の数のrsync操作を開始することです。

私は大きな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

合成ベンチマーク(Crystal Disk)では、シーケンシャル書き込みパフォーマンスは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に渡します。ただし、各ファイルに対して新しいインスタンスを作成しないでください。

答え2

次のステップは私のために働いた。

  1. 最初のコマンドを実行しrsync --dry-runて、影響を受けるファイルのリストを取得します。
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
    --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
  1. cat transfer.log次のように5秒間並列parallelに実行するように出力を入力します。rsync
$ 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オプション(協会)は、影響を受けるファイルのディレクトリ構造がソースとターゲットで同じ(/data/ディレクトリ内)に保持されることを保証するため、コマンドはソースフォルダ(たとえば/data/projects)で実行する必要があります。

答え3

個人的には、次のような簡単なものを使用します。

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

これは、空でないディレクトリが複数ある場合にのみ役立ちます。それ以外の場合、ほぼすべてのrsync終了項目が終了し、最後の項目がすべての操作を単独で実行します。

前のバックスラッシュはlsエイリアスをスキップします。これにより、出力が期待どおりに保証されます。

答え4

マルチターゲット同期には以下を使用しています。

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

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

関連情報