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 に貼り付け、グラフ生成で出力します。
新規バックアップのパフォーマンス測定
2ホスト間で rsync2 と rsync3 の各組み合わせを試行します。
src には二分木のようなディレクトリツリーを用意し、dst は空のディレクトリとします。
詳細は以下のようなダミーデータツリーを生成するスクリプトを python にて記述しました。ファイルの中身は、一度 dd で /dev/random から出力したものを各ディレクトリにコピーしたものになります。
# /dev/zero から生成すると、圧縮オプションで測定ができない可能性もあったので。
# /dev/random をそれぞれ出力していたらダミーデータの生成が終わらないのでコピーしました。
| 項目 | 値 |
|---|---|
| ディレクトリ構成 | 二分木のようなもの |
| ディレクトリ数 | 100 |
| 各ディレクトリのファイル数 | 1,000 |
| ファイルサイズ | 1KB |
| 合計ファイル数 | 100,000 |
| 合計ファイルサイズ | 100KB |
rsync3 to rsync3 の組み合わせが圧倒的に早いです。
これは、クライアントがさっさとファイルを送信することに加えて、サーバがメモリ上にファイルを受け取った時点でレスポンスを返しているからかと。
プロセス終了後に、ディスク書き込みが行われていることが確認できます。
プロセスが早々に終わるということは、他のプロセスの負荷の影響を受けないということ。
クライアントを rsync3 にすることで、プロセスをすぐに終わらせようと最初から頑張ってくれます。
サーバ側が rsync2 の場合、終了レスポンスを返してくれず仕事が残るようで、他の組み合わせ同様終了まで時間がかかります。
rsync3 はプロセスが早々に終了します。
クライアントが3だとすぐにファイルが転送されてくるため、書き込み開始が早くなります。
クライアントが3だと転送が早いので、メモリに書き込まれていくことになります。
rsync3 の組み合わせだと早々に処理を終わらせています。
中盤の 50% はディスク書き込み中。
プロセス終了後のディスク書き込みの完了までを考えても、rsync3 to rsync3 の組み合わせが最も早くなります。
差分同期のパフォーマンス測定
新規パフォーマンス測定と同様の構成で、リモート側は削除7%追加7%というファイルの差分をつくります。
rsync の組み合わせは 2 to 2 と 3 to 3 のみ確認します。
| 項目 | 値 |
|---|---|
| 削除ディレクトリ数 | 7 |
| 追加ディレクトリ数 | 7 |
| 合計削除ファイル数 | 7,000 (7%) |
| 合計追加ファイル数 | 7,000 (7%) |
| 合計ファイル数 | 100,000 |
プロセス実行時間は 2.86 倍から 4.88 倍と、少なくとも高速化されることは確かなようです。
転送速度とグラフに書いてしまったけど、転送量の間違いですね。
処理時間の全体から考えて、先に転送を開始する分、1秒に送信する転送量は総合で結構な差が生まれます。
プロセス実行時間に伴って、負荷 100% の時間が半分以下に軽減されています。
リモート側の CPU を効率よく使用しているようです。
IO wait が発生していてあたかも悪い数値のように見えそうになるけれども、転送が早々に行われているから、むしろよい数値。
転送を先にすぐ終わらせるために、メモリが先に減り始めているのだと思われます。
早々にプロセスを終了させているのは間違いないのだけど、何度やっても中盤で1秒 CPU を100%もっていかれてしまいます。
ディスク書き込み終了時とかに CPU を持って行かれているのでしょうか。
バックアップ側が仕事をしているほうが望ましいので、これはよい数値。
最後に
rsync3 は全体的に性能向上されていて、/opt/rsync に展開して使うとかすれば導入も簡単です。
–link-dest を使ったハードリンクや、–rsync-path を使った sudo 実行などと組み合わせるとかなり強力。
ただ、やっぱりメモリは一気に食いつぶしてしまうので、環境が許されるのであれば GFS 等と組み合わせたり、専用の製品を使ってどれほどの差が出るか確認してみたいものです。



















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