Одновременная или последовательная запись - имеет ли значение скорость? - PullRequest
2 голосов
/ 21 марта 2009

Одновременная или последовательная операция записи - имеет ли это значение с точки зрения скорости?

Имеет ли смысл распараллеливать все операции записи файлов с использованием многопоточности, просто чтобы повысить скорость? Конечно, все эти операции записи независимы.

Ответы [ 6 ]

3 голосов
/ 21 марта 2009

Как правило, нет.

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

Распараллеливание на диске (TCQ и ​​NCQ) в основном работает за счет уменьшения количества запросов, которые естественно требуются, когда разные клиенты одновременно запрашивают данные из разных разделов диска. Если вы можете избежать этих поисков в первую очередь, вам лучше.

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


В лучшем случае вы можете оставить это как решение для конечного пользователя (например, дать возможность отключить его) и предоставить меры по повышению производительности, которыми он будет руководствоваться. (Вы можете даже доказать, что я не прав;))

2 голосов
/ 21 марта 2009

Сначала напишите самый простой код и посмотрите, достаточно ли хорошо он работает с целевой средой . (Различные диски, версии операционной системы, процессоры, драйверы и т. Д. Могут значительно повлиять на результат.)

Если самый простой правильный код недостаточно быстр, , то имеет смысл попытаться выработать более быстрые способы выполнения ввода-вывода. При предположении может иметь смысл распараллелить операции записи, если вы записываете на разные диски, но, возможно, иначе. Это только полная догадка.

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

2 голосов
/ 21 марта 2009

Это зависит от дисков и их контроллера. У них есть TCQ / NCQ? Это RAID? Если так, это может иметь какой-то смысл. С одним обычным диском SATA без NCQ это не так.

0 голосов
/ 21 марта 2009

Это простой вопрос, но ответ может быть действительно очень сложным. Les пытаются сузить сценарий с некоторыми предположениями: ОС - Windows, у вас есть относительно большое количество записей, которые действительно независимы.

  1. Вы можете пропустить многопоточность, просто выполняя запись асинхронно.
  2. Выпустите их все сразу - позвольте ОС запланировать запись
  3. Неважно, идет ли запись в один и тот же файл или в другие файлы. Обратите внимание, что это верно только в том случае, если вышеприведенное предположение о независимости записей верно.

В худшем случае, это не будет медленнее, чем один обычный старый ежедневный диск на параллельном контроллере ATA: он будет медленным.

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

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

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

0 голосов
/ 21 марта 2009

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

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

0 голосов
/ 21 марта 2009

Если вы говорите о записи в один файл, ответ - нет. Вы не можете распараллелить запись в один файл, так как каждый процесс или поток должен получить блокировку для файла из ОС для выполнения записи.

В противном случае это должно зависеть от аппаратных контроллеров и типа хранилища, ядра ОС и реализации файловой системы.

...