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
)時間が節約されます。
parallel
(cd
ソースディレクトリに移動した後)次のコマンドを試してみました。実行時間は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
次のステップは私のために働いた。
- 最初のコマンドを実行し
rsync --dry-run
て、影響を受けるファイルのリストを取得します。
$ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
--human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
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