SSH経由のrsync転送は非常に遅い

SSH経由のrsync転送は非常に遅い

私は自分のウェブサイトのリモート バックアップを作成しています。カタログ全体は約 70 GB で、合計約 5,000,000 個のファイルがあります。バックアップ サーバーで実行するコマンドは次のとおりです。

rsync -ah -e ssh --delete --link-dest=/backups/2013.09.06 [email protected]:/var/www/backups/2013.09.07

プロセスは 48 時間以上実行され、ハングします。

クライアント (Web サイトが配置されている Web サーバー) で rsync プロセスを実行したstrace -pところ、プロセスがselectコマンドの終了時に定期的に停止し= 0 (Timeout)、しばらくしてから続行されることがわかりました。

open("mysite/files/1694201", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=10083, ...}) = 0
read(3, "\r\n\320\224\320\265\321\201\321\217\321\202\321\214 \320\273\320\265\321\202, \321\210\320\265\321\201\321\202\321"..., 10083) = 10083
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999998})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\320\260\320\262\320\260\320\271\321\202\320\265...\320\232\320\270\320\264\320\260\320\271\321\202\320\265 \320\274"..., 4092) = 4092
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 0 (Timeout)

プロセスは最後の行で 1 分ほど停止します。

なぜこのようなことが起こるのでしょうか? なぜプロセスに時間がかかり、最後まで到達しないのでしょうか?0 (Timeout)ストレース状態にある人々は何を意味するのでしょうか?

両方のサーバーは rsync 3.0.9 を実行しており、IO は過負荷になりません。

答え1

strace の 0 (タイムアウト) はどういう意味でしょうか?

5番目のパラメータについて読んでみてください選択に渡される

明らかに、rsync は (単独では) ファイルのバックアップに選択した方法には適していません。変更があったかどうかを確認するためだけに、500 万個のファイルごとにハッシュを生成し、それをネットワーク経由で送信する必要があります。

私なら、ソースサーバー上で実行されるスクリプトにラップして、

  1. 前回の同期が成功した時刻(tstart)を確認します。

  2. ソース上でmtime > tstartを持つすべてのファイルを検索します

  3. 変更されたファイルをバックアップサーバーにrsyncする

例えば

#!/bin/bash

touch newrun
find /var/www -newer lastrun -exec rsync ....
rm -f lastrun
mv newrun lastrun

答え2

本当に 50 億個のファイルがあるのですか?

高速 SAN や SSD がなく、ある程度「普通」の HDD を使用している場合、src から dst への最初の比較に非常に時間がかかるため、tgz ではなく tgz と rsync を使用することをお勧めします。

プロセスが遅いのはどこでですか? ファイル転送中ですか、それとも初期の src<->dst チェック中ですか?(増分ファイル リストの送信中...)

可能であれば、両端で IOWAIT をチェックします。また、マシンに md-raid がある場合は、cat /proc/mdstatus を実行します。非常に悪い IO パフォーマンスは、RAID の再構築の結果である可能性があります (ただし、可能性は非常に低いです)。

--progressそして、ネットワーク速度を確認するために、rsync 転送中にスイッチをオンにして、単一の大きなファイルを転送する必要がありました。

デバッグのヒント(念のため、ボトルネックになりそうな箇所はすべてテストしてください。これが問題ではないことを確かめるためです)

  • -avzh --progress --stats で rsync を試してください
  • ローカルでの io パフォーマンス
  • ネットワークパフォーマンス
  • hd/raid-status (SMART)、ハードウェアの障害をチェック

関連情報