Windows Server 2012 R2 の Robocopy のマルチ スレッド オプションについて

こんにちは。Windows プラットフォーム サポートの神田です。

本日は、Windows Server 2012 R2 の Robocopy のマルチ スレッド オプションについて説明します。

 

Robocopy はかつてはリソース キットに含まれる無償ツールとして提供していましたが、Windows Vista、Windows Server 2008 からオペレーティング システムの標準コマンドとなりました。また、Windows 7、Windows Server 2008 R2 以降の Robocopy では、以前はシングル スレッドで動作していたコピー処理を、複数のスレッド、いわゆるマルチ スレッドで動作する機能が追加されました。
/MT オプションにてマルチ スレッド実行が有効となり、最大 128 スレッドまで対応します。

なお、 /MT オプションを付与してコピーを処理をマルチ スレッド化した場合にのみ発生する障害が確認されております。下記に確認済みの問題を記載いたしますが、これらの問題に該当している場合、恐れ入りますが /MT オプションを実行コマンドから外していただきますようお願いいたします。

1. /RH オプションが正しく動作しない。

/RH オプション、/PF オプションを付与して Robocopy を実行した場合「現在はコピーを実行してよい時間帯であるかどうか」確認し、コピー処理を継続するか中断すべきかどうかを判断します。

/MT オプションを付与して実行すると、コピー処理のために複数のスレッドが作成され各々のスレッドでコピー処理が実行されますが、それらのコピー処理のスレッドでは、実行可能な時間であるか判断できない問題があり、 /RH オプションの指定時間の範囲外となっても、コピー処理がそのまま継続されてしまう障害が確認されています。

 

2.  ログの出力結果が正しく出力されない。

コピー処理の最終結果がログの最後に統計として出力されますが、マルチスレッドで実行した場合ディレクトリのカウントが正しく行われないためディレクトリ欄のコピー済み+スキップの数と合計に正しい数値が出力されません。問題があるのはログの出力結果のみで、実際のコピー処理は正しく実行されコピーの未処理、欠損はありません。

 

3. Robocopy がファイル コピー中にクラッシュする

Robocopy は、フォルダー配下のファイルについて内部的にカウントをして、コピーが完了するとカウントを減算しコピー時に使用したメモリを解放します。

マルチスレッドで実行した場合、参照カウント情報の計算に問題があり、解放済みのメモリ領域への不正なアクセスを行い、メモリ保護違反でクラッシュします。

この問題については、下記公開情報を公開しております。

 

Robocopy.exe の /MT (マルチ スレッド) オプションを使用するとコピー処理に失敗する https://support.microsoft.com/ja-jp/kb/3106369

 

また /MT オプションを外すことで、コピー処理が多重実行されないためコピー速度が低下します。パフォーマンス低下を懸念される場合は、KB3106369 に記載されている回避方法 (/MT オプションを付与しない代わりに、コピー対象のフォルダーごとに Robocoy.exe を多重実行させる) をご検討ください。