macOSのrsync新旧比較:赤い彗星?
はじめに
複数のフォルダ(各1〜10TBほど)をメーカ違いのNAS間で移動させる必要があり、MacBook Proから rsync
を利用して同期を実行しました。
標準出力の文字化け対策としてrsyncのバージョンを上げたところ、元のものに比べ処理速度が上がった感覚がありました。
休みに入って余裕が出来たので、実際に処理速度が上がったのか検証してみましたのでまとめてみます。
データ移行の経緯・概略
当初の課題は冒頭のように、メーカ違いのNAS間でのデータ移行です。NAS搭載アプリではデータ移行が出来なかったこと、また移行時にファイルを比較したデータ検証を行いたく、rsyncを利用しました。
テスト実施
NASの利用者がいない休日にテストを行いました。
Synology NASにSSH接続してTeraStationにrsyncするつもりだったのですがTeraStationとの接続に失敗しました(TS側のバージョンが古かったようです)。
ジタバタせずMacBook Pro(以下MBP)を介したrsync実行を行うことにして、両NASの必要なボリューム(共有フォルダ)をマウントしてターミナルからrsyncをドライランしました。
標準出力の文字化け
初回ドライランの際に標準出力の文字化けが気になりました。ログとして標準出力を残す設定だったので(パイプで tee
に結果を渡して記録する)、文字化けは好ましくありません。
少し調べて、新しいrsyncとlibiconvをHomebrewでインストールしました。
文字化け対策としてインストールしたもの
- rsync(3.3.0)
- libiconv
Homebrewでインストールしたrsyncは既存のrsyncをアップデートするわけではなく、別ディレクトリに別にインストールされます。
rsyncを走らせる際、このままでは古いrsyncが立ち上がってしまいます。そこでShellに新しいrsyncへのパスを通しておきました。新旧のrsyncはこんな具合です。
% rsync --version
rsync version 3.3.0 protocol version 31
% /usr/bin/rsync --version
openrsync: protocol version 29
rsync version 2.6.9 compatible
*インストールなどの参考としたサイト
rsyncの更新とlibiconvのインストールについてはこちらの記事などを参考としました。
(大変助かりました。ねこのさん、ありがとうございます)
なんだか、速い?
新しくインストールしたrsyncでドライランを再実行すると、sending incremental file list
表示後の処理開始が妙に早く感じられました。ドライラン自体・その後の本番も過去より短縮されたという感覚っです。バージョンアップだけでこんなに変わるものなのか、特に初期リスト作成が爆速だったので不思議に思いました(実際は不安になってました)。
このときすでに年末進行中で検証している余裕がなく、検証は冬休みに実施することにしました。
検証実施
というわけでマッハで冬季休業に突入、本を作って有明にいかねばならず呆然としたまま今年2024年が終わりました。
ようやく年が明けて検証できたので、波乱の結果をどうぞ。
検証環境
実行機
- MacBook Pro 16インチ、2023
- CPU:M2 Pro
- Memory:32GB
- OS:15.2(24C101)
比較するrsyncのバージョン
- OSネイティブ:2.6.9 compatible
- Homebrewインストール:3.3.0
検証結果
*実際のNASでの検証は避け、ローカルにダミーデータを作成して比較してみました。おおよその処理速度を見るだけならこれで良いと判断をしました。
テスト用ダミーフォルダ
- サイズ:223.84GB
- 項目数:17,055
rsync | 2.6.9 | 3.3.0 |
---|---|---|
開始 | 12:25:29 | 12:55:00 |
終了 | 12:41:41 | 13:00:25 |
処理時間 | 00:16:12 | 00:05:25 |
v.2系rsyncより 3倍速い!?
Ver. 2までは全ファイルのリストを取得してから転送を開始する仕様でしたが、Ver. 3より転送と並走してリスト取得をするようになったとのこと。ログを見ると2.6.9は4分くらいリスト取得にかかっていますが、3.3.0は2秒後くらいから転送が始まっています。
ENHANCEMENTS:
A new incremental-recursion algorithm is now used when rsync is talking to another 3.x version. This starts the transfer going more quickly (before all the files have been found), and requires much less memory. See the --recursive option in the manpage for some restrictions.
(rsync公式:NEWS for rsync 3.0.0 (1 Mar 2008)より)
それにしても3倍も速くなるものでしょうか。違和感が拭えません。M2プロセッサとの絡みもあるのでしょうか
念為:
% lipo -info /usr/bin/rsync
Architectures in the fat file: /usr/bin/rsync are: x86_64 arm64e
環境を用意することが出来たらば、今度はネットワーク越しでも試して数値取ってみたいと思います。
取り合えず今日はここまで。ではでは。
(多分つづく)
Discussion
間違っていたら申し訳ないのですが、macOSのデフォルトのrsync(OpenRsync)とHomebrewで入手できるrsyncは別物なのでは...?
macOS -> OpenRsync(オリジナルRsyncのBSDライセンス実装)
Hoembrew -> Rsync(オリジナル)
オリジナル版
OpenRsync(OpenBSD移管前)
ありがとうございます!
そもそも実装が(この言い方でいいのかな)違うので、動作自体も並行比較できるものでないという理解でよろしいでしょうか。
Appleさんがなぜこのまま放置しているかも謎です。興味ないのかなと。
はい正しいと思います。
元々のRsyncのライセンスは(GPLv2 ->)GPLv3で諸々制限がきついものになっています。
それだと使い勝手が悪いため、BSD-LicenseのOpenRsyncが開発されたのだと推測します。
この時、全く同じ実装をしてしまうとライセンス違反になってしまうため、諸々実装が異なっていると思います。そのため、必ずしも同様に比べられないと思います。
おっしゃる通り、興味がないあるいは変える必要性が薄いのではないかな。と。
例えば、既存のバージョンに不具合などがあれば積極的に変える理由になると思います。一方、rsyncに依存しているものがないとは言い切れない以上、ライブラリのバージョンを上げる大きいメリットがない限りやらないんだと思います。
(個人の勝手な想像です。