Есть ли плюсы / минусы опции / j Robocopy (небуферизованное копирование)

9115
Clay Nichols

Robocopy имеет параметр /Jкомандной строки, рекомендуемый для копирования больших файлов (он копирует с использованием небуферизованного ввода-вывода).

Какие (если есть) недостатки есть? По какой причине это не включено по умолчанию? (Это то, что заставило меня думать, что МОЖЕТ быть минусы.)

7
Я могу представить некоторые недостатки производительности с большим количеством ** маленьких ** файлов. Но с большими файлами? Не много. Это может быть медленнее. Я ожидаю, что это будет намного более предсказуемо при копировании в медленное место назначения. Давайте посмотрим, какие ответы мы получаем от других пользователей, так как я просто догадываюсь, атм :) Hennes 7 лет назад 0
Хммм ... если это может быть медленнее даже для больших файлов, мне интересно, каковы ПРЕИМУЩЕСТВА. Я обновил вопрос, чтобы отразить это. Clay Nichols 7 лет назад 0
Когда я копирую (используя Windows Explorer, а не Robocopy) с быстрого жесткого диска на внешний (медленный) USB-накопитель в системе с 18 ГБ ОЗУ (читай: много памяти, которую можно использовать в качестве дискового буфера), я часто сталкивался с ситуациями, когда читал исходные файлы было сделано, но размонтирование медленного USB2 диска заняло около 45 минут, пока кэш очищался. Я хотел бы иметь ограниченную кеш-память там. Это может быть просто вариант для этого в robocopy. В любом случае, пост с тегами, нам будет интересно посмотреть, какие ответы появятся. Hennes 7 лет назад 0

3 ответа на вопрос

5
Alejandro C De Baca

Great question.

Unbuffered I/O is a simple file copy from a source location to a destination location. Buffered I/O augments the simple copy to optimize for future reads of (and writes to) the same file by copying the file into the filesystem cache, which is a region of virtual memory. Buffered I/O incurs a performance penalty the first time the file is accessed because it has to copy the file into memory; however, because memory access is faster than disk access, subsequent file access should be faster. The operating system takes care of synchronizing file writes back to disk, and reads can be pulled directly from memory.

The usage note mentions large files vis-à-vis buffered I/O because:

  1. The up-front cost is expensive. The performance penalty with buffered I/O is substantially worse for large files.
  2. You get little in return. Large file blocks don't tend to stay in the cache for very long anyway, unless you have a ton of memory relative to the file size.
  3. It may not avoid disk I/O. Reads and write of large file data blocks increase the probability of requiring disk I/O.
  4. You probably don't need to buffer anyway. Large files tend to be less frequently accessed in practice than smaller files.

So there is a tradeoff, but which is appropriate for you depends on your particular case. If you are zipping up a bunch of files and transmitting the zip to a backup target, unbuffered is the way to go. Copying a bunch of files that were just changed? Buffered should be faster.

Finally, note that file size is not the only factor in deciding between buffered and unbuffered. As with any cache, the filesystem cache is faster but smaller than the source behind it. It requires a cache replacement strategy that governs when to evict items to make room for new items. It loses its benefit when frequently-accessed items get evicted. For example, if you are synchronizing user home directories intraday to a separate location (i.e., while users are actively using the files), buffered I/O would benefit from files already resident in the cache, but may temporarily pollute the cache with stale files; on the other hand, unbuffered would forego any benefit of files already cached. No clear winner in such a case.

Note: this also applies to xcopy /J

See Microsoft's Ask The Performance Team Blog for more.

1
Rüdiger

Я попробовал следующее:

При копировании с быстрого устройства (NAS через Gigabit-Ethernet) на другое быстрое устройство (USB3-диск)

  • без / J: данные считываются в буфер и записываются после этого, поэтому сеть или жесткий диск простаивают
  • с / J: данные читаются и записываются без ожидания, поэтому сеть и жесткий диск используются одновременно

Я бы предложил использовать эту опцию.

0
user778642

Если вы копируете через глобальную сеть, я рекомендую НЕ включать параметр / J для больших файлов, поскольку среднее время копирования значительно увеличится. Файлы, которые я скопировал, были от 500 МБ до 23 ГБ.

На линии 50 Мбит / с я набрал в среднем 43,5 Мбит / с (другой трафик и служебные данные), но никогда не опускался ниже 32 Мбит / с БЕЗ / J. С / J мой средний был около 25 Мбит / с ... глядя на perfmon, я мог видеть большие пики и впадины внизу.

Надеюсь, это поможет кому-то.