rsync2 と rsync3 のベンチマークの比較とまとめ

2009 年 7 月 18 日 | カテゴリー: プログラム

20090718 rsync2 と rsync3 のベンチマークの比較とまとめ

rsync によるバックアップを考えるとき、CPU 負荷、転送効率、処理時間などが無視できなくなってきます。
下手をすると深夜中に終わらずに朝を迎え、負荷がユーザにまでかかってしまうことも。

今回は rsync2 を rsync3 にした場合、アルゴリズムの変更に伴って、具体的に何がどのように改善されるのかを実際に調査してみました。

rsync3 による性能向上のまとめ

先にまとめを書いてしまいます。劇的に性能は向上していました。
新規バックアップ時のパフォーマンス測定と、差分同期時のパフォーマンス測定を行いました。

クライアントを rsync3 にすると、ファイル転送が早々に行われるようになります。
サーバを rsync3 にすると、ディスク書き込みのための処理待ちが少なくなります。
両方を3にすると、同期処理を早々に終わらせてしまい、プロセス終了後にゆっくりとディスク書き込みを行ってくれます。

改善点 コメント
プロセス実行時間の改善 新規同期時に約10倍、差分同期時に2.86倍〜4.88倍、実行時間が改善される。プロセスが早々に終了するため、異常終了等の危険に巻き込まれる可能性も軽減される。これはクライアントとサーバをともに rsync3 にしたときに効果が現れる。
クライアント CPU 負荷の軽減 バックアップ元の負荷は、クライアントを rsync3 にすることで改善される。負荷が 100% になる時間が激減する。
サーバ CPU の処理効率の向上 クライアントとサーバがともに rsync3 のとき、序盤早々に計算を終わらせることができる。バックアップ先はバックアップがお仕事なのだから、CPU は遊ばせていないほうがいい。
書き込み開始時間の向上 転送開始時間と関係するが、データがすぐに送られてくるため、ディスク書き込みが早期に開始されるようになる。クライアントを rsync3 にしたときに効果が現れる。
書き込み効率の向上 ファイル書き込みを早期から行うこととなり、I/O wait は安定して 50% をキープして CPU の邪魔をすることがなくなる。サーバ側を rsync3 にすると効果が出るが、クライアントも 3 でないと足を引っ張られる。
転送開始時間の向上 転送が早々に行われるようになる。rsync2 では全インデックス作成が完了するまで転送が開始されなかったため、差分同期時に劇的な処理時間の差が生まれる。

基本的なパフォーマンス測定方法

ダミーデータを用意し、CPU 負荷などを vmstat で確認していく方針です。
ダミーデータをスクリプトで生成します。
クライアント側とサーバ側で同時に測定できるように、ssh でサーバ側の vmstat も起動するようにスクリプトをまとめます。
vmstat は時間出力をしてくれないので、時間出力を vmstat に混ぜるスクリプトも記述します。
vmstat の結果を OpenOffice Calc に貼り付け、グラフ生成で出力します。

新規バックアップのパフォーマンス測定

20090718 rsync ベンチ用ダミーデータ構成

2ホスト間で rsync2 と rsync3 の各組み合わせを試行します。
src には二分木のようなディレクトリツリーを用意し、dst は空のディレクトリとします。

詳細は以下のようなダミーデータツリーを生成するスクリプトを python にて記述しました。ファイルの中身は、一度 dd で /dev/random から出力したものを各ディレクトリにコピーしたものになります。
# /dev/zero から生成すると、圧縮オプションで測定ができない可能性もあったので。
# /dev/random をそれぞれ出力していたらダミーデータの生成が終わらないのでコピーしました。

項目
ディレクトリ構成 二分木のようなもの
ディレクトリ数 100
各ディレクトリのファイル数 1,000
ファイルサイズ 1KB
合計ファイル数 100,000
合計ファイルサイズ 100KB

20090718 プロセス実行時間 新規

rsync3 to rsync3 の組み合わせが圧倒的に早いです。
これは、クライアントがさっさとファイルを送信することに加えて、サーバがメモリ上にファイルを受け取った時点でレスポンスを返しているからかと。
プロセス終了後に、ディスク書き込みが行われていることが確認できます。
プロセスが早々に終わるということは、他のプロセスの負荷の影響を受けないということ。

20090718 src CPU 負荷 新規

クライアントを rsync3 にすることで、プロセスをすぐに終わらせようと最初から頑張ってくれます。
サーバ側が rsync2 の場合、終了レスポンスを返してくれず仕事が残るようで、他の組み合わせ同様終了まで時間がかかります。

20090718 dst CPU 負荷 新規

rsync3 はプロセスが早々に終了します。

20090718 dst IO wait 新規

クライアントが3だとすぐにファイルが転送されてくるため、書き込み開始が早くなります。

20090718 dst 残りメモリ 新規

クライアントが3だと転送が早いので、メモリに書き込まれていくことになります。

20090718 src CPU Idel 新規

rsync3 の組み合わせだと早々に処理を終わらせています。

20090718 dst CPU Idel 新規

中盤の 50% はディスク書き込み中。
プロセス終了後のディスク書き込みの完了までを考えても、rsync3 to rsync3 の組み合わせが最も早くなります。

差分同期のパフォーマンス測定

新規パフォーマンス測定と同様の構成で、リモート側は削除7%追加7%というファイルの差分をつくります。
rsync の組み合わせは 2 to 2 と 3 to 3 のみ確認します。

項目
削除ディレクトリ数 7
追加ディレクトリ数 7
合計削除ファイル数 7,000 (7%)
合計追加ファイル数 7,000 (7%)
合計ファイル数 100,000

20090718 プロセス実行時間 差分

プロセス実行時間は 2.86 倍から 4.88 倍と、少なくとも高速化されることは確かなようです。

20090718 転送量 差分

転送速度とグラフに書いてしまったけど、転送量の間違いですね。
処理時間の全体から考えて、先に転送を開始する分、1秒に送信する転送量は総合で結構な差が生まれます。

src CPU 負荷 差分

プロセス実行時間に伴って、負荷 100% の時間が半分以下に軽減されています。

20090718 dst CPU 負荷 差分

リモート側の CPU を効率よく使用しているようです。

20090718 dst IO wait 差分

IO wait が発生していてあたかも悪い数値のように見えそうになるけれども、転送が早々に行われているから、むしろよい数値。

20090718 dst 残りメモリ 差分

転送を先にすぐ終わらせるために、メモリが先に減り始めているのだと思われます。

20090718 src CPU Idel 差分

早々にプロセスを終了させているのは間違いないのだけど、何度やっても中盤で1秒 CPU を100%もっていかれてしまいます。
ディスク書き込み終了時とかに CPU を持って行かれているのでしょうか。

20090718 dst CPU Idel 差分

バックアップ側が仕事をしているほうが望ましいので、これはよい数値。

最後に

rsync3 は全体的に性能向上されていて、/opt/rsync に展開して使うとかすれば導入も簡単です。
–link-dest を使ったハードリンクや、–rsync-path を使った sudo 実行などと組み合わせるとかなり強力。

ただ、やっぱりメモリは一気に食いつぶしてしまうので、環境が許されるのであれば GFS 等と組み合わせたり、専用の製品を使ってどれほどの差が出るか確認してみたいものです。

  1. taramonera
    2010 年 3 月 1 日 21:29

    読みやすいですね。大変参考になりました。