Contents
robocopy 最小化すると早く終わる説
ファイルサーバの移行などに利用する robocopy コマンドですが、robocopy 実行中のコマンドプロンプトを最小化するとコピーが早く終わる説があります。
これって実は Windows Server の構築本なんかでも書かれている情報です。
大量のファイル群を移行する場合にはROBOCOPYコマンドも有効です。このコマンドでは、共有設定は移行できませんが、移行を複数回に分けて実行する場合などに利用できます。なお、実行時にはコマンドプロンプトを最小化することによって、処理の高速化が期待できます。
標準テキスト Windows Server 2012 R2 構築・運用・管理パーフェクトガイド より引用
[標準テキスト]Windows Server 2012 R2 構築・運用・管理パーフェクトガイド
posted with ヨメレバ知北直宏/日本マイクロソフト株式会社 SBクリエイティブ 2014年09月30日
今回はそれが本当なのかを検証してみます。
通常のコピーとの違いを認識する
robocopy はオプションが大量にあります。以下はよく使うオプションを抜粋したものです。
- /MIR ディレクトリをミラーリングする
- /S サブディレクトリをコピーするが空のディレクトリはコピーしない
- /E 空のディレクトリを含むサブディレクトリをコピーする
- /R:n コピーが失敗した時のリトライ回数(既定値は100万回)
- /W:n リトライする間隔の設定(既定値は30秒)
- /COPY:Flag ファイルにコピーする情報を指定する(既定値は/COPY:DAT)
- D:データ
- A:属性
- T:タイムスタンプ
- S:セキュリティ
- O:所有者情報
- U:監査情報
- /COPYALL ファイル情報をすべてコピーする(/COPY:DATSOU と同じ)
折角なので、「そもそも通常のコピーより robocopy の方が早いの?」という素朴な疑問にもお答えしようかと思います。そこで今回は以下の4つの計測を行います。
- 通常のコピー
- 通常のコピー実行中のウィンドウを最小化
- robocopy
- robocopy 実行中のコマンドプロンプトを最小化
ただし、通常のコピーと robocopy の時間差を計測するという事は、同じ情報をコピーしなければ意味がありません。そこで通常のコピーはどのような情報をコピーしているのかを改めて整理します。
通常のコピーがコピーする情報
orasys というユーザでCドライブ直下にテストフォルダを作成し、oradb ユーザに対するフルコントロールを与えました。
テストフォルダの中には空の「新しいフォルダー」と “あ” とだけ入力した「新しいテキストドキュメント.txt」を用意しました。
テストフォルダを右クリックから普通に別ホストのCドライブへコピーしました。以下のようにフォルダに設定したアクセス権は消えています。
このCドライブへは Administrator でログインしたため、Administrator がファイルを作ったかのような扱いになっています。
「新しいフォルダー」は空だったので、下図より空のフォルダでもコピーされることが分かります。
「新しいテキストドキュメント.txt」の所有者もコピー先のユーザになっています。また、作成日時がコピーした日時になっています。Administrator が新規でファイルを作成したような扱いですね。ただし更新日時はコピーできているようなので、タイムスタンプは一部コピーしているようです。
計測に使用する robocopy オプションはこれだ!
これらのことから、私は以下のコマンドを速度計測に使用することにしました。
robocopy C:\テストフォルダ \\192.168.0.1\C$\テストフォルダ\ /E /R:1 /W:1
本当は「/COPY:DA」でタイムスタンプを除外したかったんですが、Windows Server 2016 で実行するとコピーフラグが強制で最低 DAT になります。
C:\Users\Administrator> robocopy C:\テストフォルダ \\192.168.0.1\C$\テストフォルダ\ /E /COPY:DA /R:1 /W:1
コピー元 : C:\テストフォルダ\
コピー先 : \\192.168.0.1\C$\テストフォルダ\
ファイル: *.*
オプション: *.* /S /E /DCOPY:DA /COPY:DAT /R:1 /W:1
通常コピーにはタイムスタンプ(作成日時)は含まれないので微妙にコピー情報が違ってしまうのですが、そこは許してください。
通常コピーと robocopy の時間計測
今回は 26GB のテストフォルダを用意しました。中身はエクセルファイルやワードワイル、画像ファイル、実行ファイルなど様々です。
コピー元とコピー先は同じスイッチに接続しており、それら以外の接続はありません。
計測結果
テスト順序の前後関係が結果に影響を及ぼす可能性を私の知識では完全に否定できないので、テストは結果の並び順に2回ずつ実施しました。以下がその結果です。
コピー方法 | 結果タイム |
通常のコピー | 5分54秒 |
通常のコピー(ウィンドウ最小化) | 5分35秒 |
robocopy | 6分22秒 |
robocopy(コマンドプロンプト最小化) | 6分9秒 |
robocopy | 6分26秒 |
robocopy(コマンドプロンプト最小化) | 5分56秒 |
通常のコピー(ウィンドウ最小化) | 5分40秒 |
通常のコピー | 5分40秒 |
ええ…。robocopy の方が遅いやん。
どうやら純粋にコピーする目的の場合通常のコピーの方が早いようです。ウィンドウを最小化して効果があるかは微妙ですね。おまじないとして最小化するといいかもしれません。
「robocopy 実行時にコマンドプロンプトを最小化すると早くなるか」に対する答えは「早くなる」です。
余談:xcopy と fastcopy
robocopy を調べると引っかかる「xcopy」と「fastcopy」。xcopy は robocopy と同じくコマンドベースのツールで、Windows に標準搭載されています。fastcopy はコピーが速いと有名なフリーソフトです。ついでだったのでこの2つも同じ環境で計測してみました。
xcopy
実行する xcopy コマンドは以下です。
xcopy C:\テストフォルダ \\192.168.0.1\C$\テストフォルダ\ /E /C /H
- /E ディレクトリまたはサブディレクトリが空であってもコピーする
- /C エラーが発生してもコピーを続ける
- /H 隠しファイルやシステムファイルもコピーする
結果は以下のとおりでした。
xcopy:5分59秒
xcopy(コマンドプロンプト最小化):6分4秒
robocopy よりは早いですね。ただし、xcopy はコマンドプロンプトを最小化しても意味はないようです。
fastcopy
fastcopy はフリーソフトですがインストールが必要です。インストール自体は一瞬で終わります。
こんな感じでコピーを開始します。
結果は以下のとおりでした。
fastcopy:5分28秒
速いですね。スピード勝負では fastcopy が王者のようです。
fastcopy は円マークの在り無しで動きが変わります。例えば Source のフォルダの最後の “\(円マーク)” がある場合、そのフォルダの中身だけがコピーされます。今回のようにルートフォルダごとコピーしたい場合は円マークを除きます。