Почему 16 потоков более эффективны, чем 8 на i7 с 4-ядерным ядром с гиперпоточностью? (Robocopy)

778
Herb

В Windows 8.1 я использую Robocopy для сохранения данных 2 серверов в специальном хранилище ПК. Объем данных составляет 147 314 файлов в 4 110 папках (66 841 845 760 байт).

Все 3 задействованных ПК оснащены процессором i7 с 4 ядрами и находятся в сети 1 Гб. Пространство памяти цели (зеркальное и полосатое на D :) реализовано с использованием корпуса JBOD 4 x 4 ТБ.

Из-за 4-х ядер ЦП и гиперпоточности я ожидал, что коммутатор Robocopy / MT: 8 будет работать лучше, и что более 8 потоков будут излишними из-за отсутствия управления потоками бенефициаров.

Я проверял это. Я перечисляю здесь данные четвертой серии испытаний (продолжительность в мм: сс):

 1 thread: 59:19 2 threads: 39:12 4 threads: 29:13 8 threads: 24:36 16 threads: 24:19 32 threads: 24:27 

Конечно, несколько секунд, использующих 16 потоков, пренебрежимо малы, но они одинаковы во всех сериях тестов, т. Е. Не из-за большей нагрузки на тест менее 16 потоков (если это не было так во всех 4 сериях тестов). Также обратите внимание, что 32 потока почти всегда немного быстрее, чем 8 потоков.

Вопрос: по какой технической причине использование 16 потоков более эффективно, чем 8 потоков на i7 с 4 ядрами с многопоточностью?

4

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

3
Mokubai

TL; dr версия: если вы выполняете что-то сильно загружающее ЦП, такое как перекодирование видео с помощью Handbrake, то вам не захочется использовать больше ядер, чем ЦП, так как для работы не будет места. В этом случае, когда большинство потоков будет тратить 90% своего времени на ожидание чтения или записи, имея больше потоков работает для вас, а не против.


Копирование файлов не является особо сложной задачей. Хотя наличие большего количества ядер может помочь предотвратить блокирование вашего инструмента копирования другими задачами, маловероятно, чтобы каждый поток работал где-то на 100% на каждом ядре.

Каждый поток копирования отправит запрос на чтение на жесткий диск, а затем перейдет в спящий режим в ожидании выполнения запроса на чтение. Ваш вращающийся диск ржавчины обычно имеет время поиска 9 миллисекунд, практически целую вечность с точки зрения ЦП, и задача копирования не будет просто вращаться, говоря: "это уже готово?" и тратить циклы процессора. Это блокирует этот поток на 100% ресурсов процессора и тратит впустую ресурсы. Нет, происходит то, что поток выполняет чтение и поток переводится в спящий режим до тех пор, пока чтение не завершится и данные не будут готовы к следующему шагу.

Тем временем другой поток делает то же самое, блокируется на чтение и помещается в спящий режим. Это происходит для всех 16 ваших тем. (На самом деле ваши чтения и записи будут происходить в случайное время, когда они не синхронизированы, но вы поняли)

Как только у одного из потоков есть данные, готовые для него, Windows перепланирует его и начинает обрабатывать для записи. Что касается потока, процесс такой же. Там написано «записать эти данные в файл x в месте y», и Windows берет данные и удаляет поток. Windows выполняет фоновую работу, чтобы выяснить, где находится файл, перемещает данные (возможно, по сети, добавляя к задержке больше миллисекунд), а затем возвращает управление потоку после успешного завершения записи.

Ни один поток не будет гореть все время на ядре ЦП, и поэтому больше потоков, чем у вас ЦП, не является проблемой. Никакая нить не проснется достаточно долго, чтобы это стало проблемой.

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

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

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

Мы очень ценим ваш ответ, а также заметку о твердотельных накопителях. Являются ли эти замечания SSD также действительными для HDD на SSD или SSD на HDD, соответственно? (Не то чтобы это относится к вопросу, просто из интереса.) Herb 6 лет назад 0
Единственный способ узнать это попробовать. Но если на пути есть жесткий диск, его задержки абсолютно затопят общее время передачи. Для SSD на SSD ... типичное чтение или запись SSD составляет порядка миллисекунды, но это все еще небольшая часть времени ЦП, необходимого для запроса следующего чтения или записи. то есть вы все еще можете оказаться в ситуации, когда вы не будете держать SSD настолько загруженными, какими они могли бы быть. Jamie Hanrahan 6 лет назад 1