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に渡します。ただし、各ファイルに対して新しいインスタンスを作成しないでください。

おすすめ記事