Назад | Перейти на главную страницу

Копирование файлов с использованием многопоточности увеличивает производительность. Почему?

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

У меня вопрос: почему многопоточность значительно увеличивает время обработки копирования для большого количества файлов? В любом случае ЦП не должен делать много работы. Спасибо.

Должны быть некоторые накладные расходы на рукопожатие для каждого файла (особенно при копировании в общий сетевой ресурс), которые уменьшаются при использовании многопоточного копирования с большим количеством маленьких файлов, потому что вы выполняете рукопожатие одновременно. Я подозреваю, что вы увидите меньше преимуществ с большими файлами. Этот тест, кажется, поддерживает эту гипотезу: https://www.demartek.com/Reports_Free/RMWTUG_2011-03_Robocopy_multithread_Testing_Dennis_Martin_a.pdf

Примерами накладных расходов на рукопожатие могут быть проверка того, существует ли уже целевой файл, проверка разрешений, ..

Даже на локальном диске есть некоторые накладные расходы на файл, которые, как я полагаю, в основном связаны с расходами на открытие файла: чтобы открыть существующий файл, Windows должна проанализировать путь, найти соответствующие записи на каждом уровне каталога. дерево, найдите файл в MFT и проверьте ACL. Чтобы создать новый файл, Windows должна проанализировать путь, найти соответствующие записи на каждом уровне дерева каталогов, проверить ACL каталога и добавить файл в MFT и запись в каталоге верхнего уровня.

Если у вас только один поток, вам нужно открыть исходный файл, открыть целевой файл, скопировать данные и закрыть файлы, и только после этого вы можете перейти к следующему. Это означает, что подсистему ввода-вывода следует оставлять на время простоя. Если у вас несколько потоков, вы можете открывать файлы одновременно с копированием данных; в идеале вы постоянно загружаете систему ввода-вывода.

Накладные расходы не так уж и заметны для одного файла, но если у вас много маленьких файлов, они складываются, и экономия времени может быть значительной.