Сколько потоков для чтения и записи на жесткий диск? - PullRequest
10 голосов
/ 16 марта 2011

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

Я хочу спросить: каково оптимальное количество параллельных потоков, которые будут выполнять эту задачу?

Я имею в виду, сколько потоков я должен прочитать на жестком диске, не создавая жесткий диск замедляться, потому что многие потоки читают его одновременно.

Спасибо!

Ответы [ 7 ]

5 голосов
/ 16 марта 2011

Сначала я говорю один!

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

В противном случае более одного потока делает жесткий диск более напряженным, чем необходимо: одновременное чтение из разных потоков вызовет поиск операций для чтения файловых блоков (*), что приведет к дополнительным издержкам, которые могут замедлить работу системы. в зависимости от количества прочитанных файлов и размера файлов.

Чтение файлов последовательно.

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

3 голосов
/ 16 марта 2011

Никогда не обрабатывайте операции с IO-плотностью одновременно. Это медленнее, потому что дисковый зонд тратит много времени на переключение между различными потоками / файлами.

Что мне делать, еслиУ меня есть несколько потоков в операциях ввода-вывода? Производить операции одновременно и выполнять их однопоточно.У нас есть контейнер, такой как ConcurrentQueue<T> (или потокобезопасная очередь, написанная вами), и есть 10 потоков, которые будут читать из этих файлов 1.txt 2.txt ... 10.txt.Вы помещаете «запросы на чтение» в очередь одновременно, другой поток обрабатывает все запросы (откройте 1.txt, получите то, что вы хотите и продолжите с 2.txt), дисковый зонд не будет занят переключением между потоками/ файлы в этом случае.

3 голосов
/ 16 марта 2011

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

Чтобы привести несколько примеров (я игнорирую соединения, точки повторной обработки ...)

  • C: C: 1 нить ИТОГО
  • C: to D: один и тот же физический диск, разные разделы: 1 поток ВСЕГО
  • C: D: другой физический диск: 2 потока ИТОГО

Я работаю на предположении, что диск может выполнять ОДНУ операцию за раз, и каждый раз, когда он "многозадачен", переключаясь между различными операциями чтения / записи, он теряет скорость. Механические диски имеют эту проблему (но технически NCQ МОЖЕТ помочь). Твердотельные диски, которых я не знаю (но я знаю, что USB-флешки ОЧЕНЬ медленны, если вы пытаетесь выполнять 2 операции одновременно)

Я искал, как вы это делаете ... Я не нашел "конкретных" примеров, но у меня есть несколько ссылок на Windows API, с которых вы могли бы начать:

2 голосов
/ 16 марта 2011

Как следует из тега "C #", я предполагаю, что вы пишете управляемое приложение для выполнения дискового ввода-вывода.

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

Насколько я знаю, запросы дискового ввода-вывода от управляемых потоков уровня пользователя будут поставлены в очередь в очереди APC уровня ядра, и потоки ввода-вывода Windows будут обрабатывать их.

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

Я не видел ни одного API-интерфейса для потоков .NET, который позволял бы связывать любые пользовательские задачи с потоками ввода-вывода Windows.Тем не менее, обратите внимание, что мой ответ основан на сравнительно старой информации в следующей ссылке Потоки ввода-вывода Windows против потоков управляемого ввода-вывода .

Если кто-то лучше знает текущую модель пула потоков Windows 7, которая отличается от информации в ссылке, пожалуйста, поделитесь этой информацией, чтобы обучить меня.

Кроме того, вы можете найти следующую ссылку полезной для понимания операций ввода-вывода файла Windows: Синхронный и асинхронный ввод-вывод

2 голосов
/ 16 марта 2011

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

2 голосов
/ 16 марта 2011

Я бы сказал, что одной нити достаточно. Процессор может запускать много потоков, но скорость жесткого диска на много порядков ниже, чем у процессора. Даже если запуск большего количества потоков сделает запросы на ввод / вывод быстрее (в этом я не уверен), это не заставит жесткий диск на самом деле читать быстрее. Это может даже замедлить его.

1 голос
/ 16 марта 2011

Многие ответы относятся к количеству жестких дисков.Имейте в виду, что это также зависит от количества контроллеров.Иногда два жестких диска управляются одним контроллером.Также: два раздела на одном и том же HDD не являются двумя HDD!

...