私は自分のウェブサイトのリモート バックアップを作成しています。カタログ全体は約 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 万個のファイルごとにハッシュを生成し、それをネットワーク経由で送信する必要があります。
私なら、ソースサーバー上で実行されるスクリプトにラップして、
前回の同期が成功した時刻(tstart)を確認します。
ソース上でmtime > tstartを持つすべてのファイルを検索します
変更されたファイルをバックアップサーバーに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)、ハードウェアの障害をチェック