この記事で伝えたいこと
- Robocopyには帯域制限のための
/ipg:
というオプションがありますが、帯域制限機能としては不安定です - 代わりにWindowsの帯域制限機能を使ってください
Robocopyとは
- すでに良い解説記事があるのでそちらをご覧ください
- Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる
- RobocopyのTips
-
Windowsのrobocopyコマンドでファイルコピー中断後に自動再開させる
- この記事で帯域制限とipgオプションについて解説があります
ipgオプションで帯域制限できるらしいが。。。
- 使ってみたところ、小さいファイルが沢山あるときと大きいファイルがあるときで、同じ容量の送信でも使用する帯域が大きく異なる事象が判明しました
- その原因と、代わりにどうすればいいかを解説します
まずRobocopyとipgオプションの挙動をざっくり説明1
- 指定されたディレクトリ配下のファイルを1つ選択
- コピー元・コピー先のファイルの更新日付等チェックしてコピー先に送信する必要があるかチェック
- 送信する必要があると判断した場合ファイルをオープン
- オープンしたファイルを送信しきるまで次の操作をする
- 1ブロック(1MB)分まで読み取って送信
- ipgオプションが指定されている場合はその秒数待つ
- 全ファイル送信しきるまで1.〰4.を繰り返す
何が問題か
- ipgは1ブロック送信するごとの待ち時間で、コマンド実行時に指定した値で一定です
- ほとんどの場合、ファイルの末端のブロックは1MB未満になります
- きっちり1MBで分割できるファイルサイズである場合以外はそうなります。
- 例えば、1MB+1Byteのファイルサイズだと、先頭1ブロックは1MBで、次のブロックは1Byteになります
- 0.5MBのファイルサイズだと、0.5MBの1ブロックのみになります
- きっちり1MBで分割できるファイルサイズである場合以外はそうなります。
- ブロックサイズはバラバラなのに待ち時間(ipg)は一定のため、使用する帯域(MB/s)はブロックサイズ応じてバラバラになります
- 普通はフォルダ内のファイルサイズはバラバラなので、例えば次のような不安定な帯域使用になります
- 大きいファイルが多いフォルダのコピーをしてる間は使用帯域が大きくなる
- 上記のフォルダのコピーが終わり、小さいファイルが多いフォルダのコピーになると急に帯域が少なくなる
次の合計2MBを送信する2つの例で計算すると分かりやすいと思います
- 2MBのファイル1つを送信。ipgで1秒の待ち時間を指定
- ブロックは1MBのブロック2つ。ブロックごとの待ち時間1秒なので、2秒の待ち時間
- 送信量 / 待ち時間 = 2MB / 2s = 1MB/s
- 0.5MBのファイル4つを送信。ipgで1秒の待ち時間を指定
- ブロックは0.5MBのブロック4つ。ブロックごとの待ち時間1秒なので4秒の待ち時間
- 送信量 / 待ち時間 = (0.5MB * 4) / 4s = 0.5MB/s
代わりにどうするのか
- この機能を使ってください
- アウトバウンドの帯域制限をWindows標準機能で行う
- 記事タイトルにもあるようにアウトバウンド制限になります。
- Robocopyをコピー元のサーバーで実行する等して、インバウンド制限を気にしないようにする必要がありそうです
- 調べたところ、Windows7, Windows 2012から使える機能です
-
記事の内容や実際に動かしていく中で、「こう動いてると考えるのが妥当」と判断して記載しています。公式にMicrosoftに問い合わせたりして確認した内容ではありません ↩