マルチスレッド (Multi Thread) 数の適正化
マルチスレッドとは、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
複数プロセス同時実行
これは単に複数の robocopy を並行実行するだけです。ネットワーク経由 (SMB/CIFS 経由) の場合、1 プロセスにつき 1 つの TCP コネクション使われますが、特にストレージ製品では 1 ユーザがネットワークリソースを使いきらないように、1 TCP コネクションあたりの速度制限を掛けている場合がままあります。
このような制限を抜けるために、複数コネクションを張るべく複数の robocopy を並行して同時実行するのが有効です。/MT オプションを使う場合はその影響も受けますので、実験的にチューニングして比較するしかないでしょう。
余計なプロセスを走らせない(特にコピー先のウィルス対策ソフトのスキャン)
robocopy 実行中は (速度を上げたいなら) 当然余計なプロセスが動作しないように注意を払う必要があります。特にコピー先サーバ上でウィルス対策ソフトのリアルタイムスキャンが動いていると、コピーをするたびにウィルススキャンが走り、速度が著しく低下しますので確実に停止しましょう。
タスクマネージャやパフォーマンスモニタ等でプロセスやリソース状態を確認しながら実施すると良いでしょう。
タスクスケジューラで実行するときの優先度を確認
夜間に robocopy /MIR による同期バックアップをタスクスケジューラで実行する、というケースも多いでしょう。そのときも同様に、他の重いプロセスが走っていないかに注意が必要です。
タスクスケジューラの場合、この影響がより大きくなります。というのも、タスクスケジューラで実行するものはデフォルトでは優先度が低め (通常以下) に設定されているからです。しかも設定上は出てこず気付きにくいです。
これを設定変更するには、以下の手順を実施します。
1. タスクスケジューラを起動し、該当スケジュールを右クリックし、「エクスポート」をクリックします
2. XMLファイルを任意の場所に保存します。
3. 該当タスクを右クリックし、「削除」をクリックし削除します。
4. XMLファイルをテキストエディタで開き、<Priority>7</Priority> と書かれた箇所の 7 を 6 未満に変更します(0=リアルタイム、1=高、3=通常以上、6=通常)。
5. タスクスケジューラの該当タスクがあったディレクトリを右クリックし、「タスクのインポート」をクリックし、編集した XML ファイルを指定します。
コマンド実行をコピー先とコピー元で入れ替える
これは環境と実際にやろうとしている内容に依るので「入れ替えてみて、早くなったらよし、遅くなったら元に戻す」という感じでトライエラーするしかありません。
ネットの情報では『コピー先で robocopy コマンドを実行するほうが速い。なぜなら一番時間のかかる処理はコピー先のディレクトリツリー情報を全探索する処理だからだ。』とあります。
『じゃあコピー先が空フォルダの場合は?』というと、そんな処理時間掛からないですよね。その場合は考え方として
コピー先 ⇒ HDD Write
という負荷のバランスの取り方もあると思います。あとはコピー元とコピー先の CPU/Memory/Disk 回転数等のスペック次第。
この 5 つの点を踏まえ、君だけのオリジナルさいきょう robocopy コマンドを編み出してくれ!
コメント