robocopy の速度向上ノウハウ~遅い原因と見直すべき5点~

スポンサーリンク
スポンサーリンク

1.マルチスレッド(Multi Thread)数の適正化

マルチスレッドとは、1つのプロセス内で複数のCPUコアを使う方式のことです。マルチスレッドについてもう少し踏み込んだ説明は以下をご参照下さい。

CPUのコアとは?コンテキストとは?プロセスとスレッドの違いとは?ハイパースレッディングとは?
CPUのコアとは?コンテキストとは?プロセスとスレッドの違いとは?ハイパースレッディングとは?
CPUコアとは 最近のCPUは、1つのCPUに複数のコア(実際に処理を行う部品...

デフォルトでは robocopy /MT:8 となっています。これは8スレッドを使う、という意味ですが、CPUが8コア以上ではないとあまり効率的ではありません。これを適切な値に設定すれば高速化が可能になります。

経験則的に、(搭載したCPUコア-1)くらいが速いです。4コアであれば /MT:3 と設定します。

ただし、この/MTオプションを明示した場合、 /NP オプションが無効化されてしまう、というバグがあります(/NPとは、進捗率を表示させないオプション)。これは思いのほか困ったバグで、進捗を示す0%や100%がログに表示されます。それも予測できない箇所に。そのため、実行結果をWinMergeやdiffでログを比較すると、この0%や100%が差分として検知されてしまうのです。

このバグは2009年から一向に解消されておらず、各所から怒りの声が上がっています。

ここで以下サイトの怒りの声(日本語訳)をダイジェストでお送りします。

引用:https://social.technet.microsoft.com/Forums/windows/en-US/e8c38fe1-df36-4dfc-8dd5-50613b1a7984/robocopys-mt-option-disables-np-option?forum=w7itprogeneral


RobocopyのWin7バージョンにはバグがあるようです。”Multi Threded”オプションを付けると “No Progress”オプションが無効になるようです。ログに “100%”を書き込まずに/ MTオプションを使用する方法はありますか?

Sunday, December 13, 2009 12:10 AM


こんにちはIs_mstn。この問題を再現することができましたのでバグデータベースに追加しました。報告して頂きありがとうございます。すぐに修正されるべきだと思います。 🙂感謝します。

Wednesday, December 16, 2009 9:42 AM


この問題、まだ解決されていないみたいですが、何かコメントありますか?

Tuesday, December 28, 2010 5:25 PM


「すぐに修正されるべき」と言ってたのに20カ月経ってもまだ修正されていません… 間もなく修正されるのでしょうか?

Sunday, August 21, 2011 9:16 AM


このスレッドで他の多くのユーザーから報告されているように、この問題は3年経過しても解決されていません…あの話は何だったのですか?

Sunday, July 22, 2012 7:15 AM


うーん、マイクロソフトの “すぐ”って言葉の定義、いいね!2009年12月21日~2015年11月2日現在でまだ修正されていません。6年!

Monday, November 02, 2015 10:40 PM


PowerShellで解決策を見つけたけどあんまりエレガントな方法じゃないや。。問題解決まだー?

Wednesday, January 17, 2018 2:37 PM

スポンサーリンク

2.複数プロセス同時実行

これは単に複数のrobocopyを並行実行するだけです。ネットワーク経由(CIFS経由)の場合、1プロセスにつき1つのTCPコネクション使われますが、特にストレージ製品では1ユーザがネットワークリソースを使いきらないように、1TCPコネクションあたりの速度制限を掛けている場合がままあります

このような制限を抜けるために、複数コネクションを張るべく複数のrobocopyを並行して同時実行するのが有効です。/MTオプションを使う場合はその影響も受けますので、実験的にチューニングして比較するしかないでしょう。

3.余計なプロセスを走らせない(特にコピー先のウィルス対策ソフトのスキャン)

robocopy実行中は(速度を上げたいなら)当然余計なプロセスが動作しないように注意を払う必要があります。特にコピー先サーバ上でウィルス対策ソフトのリアルタイムスキャンが動いていると、コピーをするたびにウィルススキャンが走り、速度が著しく低下しますので確実に停止しましょう。

タスクマネージャやパフォーマンスモニタ等でプロセスやリソース状態を確認しながら実施すると良いでしょう。

4.タスクスケジューラで実行するときの優先度を確認

夜間にrobocopy /MIRによる同期バックアップをタスクスケジューラで実行する、というケースも多いでしょう。そのときも同様に、他の重いプロセスが走っていないかに注意が必要です。

タスクスケジューラの場合、この影響がより大きくなります。というのも、タスクスケジューラで実行するものはデフォルトでは優先度が低め(通常以下)に設定されているからです。しかも設定上は出てこず気付きにくいです。

これを設定変更するには、以下の手順を実施します。

1. タスクスケジューラを起動し、該当スケジュールを右クリックし、「エクスポート」をクリックします

スポンサーリンク

2. XMLファイルを任意の場所に保存します。

3. 該当タスクを右クリックし、「削除」をクリックし削除します。

4. XMLファイルをテキストエディタで開き、<Priority>7</Priority> と書かれた箇所の7を6未満に変更します(0=リアルタイム、1=高、3=通常以上、6=通常)。

5. タスクスケジューラの該当タスクがあったディレクトリを右クリックし、「タスクのインポート」をクリックし、編集したXMLファイルを指定します。

5. コマンド実行をコピー先とコピー元で入れ替える

これは環境と実際にやろうとしている内容に依るので試すしかありませんが、ネットの情報では『コピー先でrobocopyコマンドを実行するほうが速い。なぜなら一番時間のかかる処理はコピー先のディレクトリツリー情報を全探索する処理だからだ。』とあります。

『じゃあコピー先が空フォルダの場合は?』というと、そんな処理時間掛からないですよね。その場合は考え方として

コピー元 ⇒ HDD Readとコマンド実行

コピー先 ⇒ HDD Write

という負荷のバランスの取り方もあると思います。あとはコピー元とコピー先のCPU/Memory/Disk回転数等のスペック次第。

この5つの点を踏まえ、君だけのオリジナルさいきょうrobocopyコマンドを編み出してくれ!

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク