Я хотел бы задать вопрос, затем ответить на него своим собственным ответом, но также посмотреть, какие ответы имеют другие люди.
У нас есть два больших файла, которые мы хотели бы читать из двух отдельных потоков одновременно. Один поток будет последовательно читать файл A, а другой поток будет последовательно читать файл B. Между потоками нет блокировки или связи, оба последовательно читают так быстро, как могут, и оба сразу отбрасывают прочитанные данные.
Наш опыт работы с этой установкой в Windows очень скудный. Суммарная пропускная способность двух потоков составляет порядка 2-3 МБ / с. Похоже, что накопитель проводит большую часть своего времени в поисках вперед и назад между двумя файлами, по-видимому, читая очень мало после каждого поиска.
Если мы отключим один из потоков и временно посмотрим на производительность одного потока, мы получим гораздо лучшую пропускную способность (~ 45 МБ / с для этой машины). Очевидно, что плохая двухпоточная производительность является артефактом планировщика диска ОС.
Есть ли что-то, что мы можем сделать, чтобы улучшить производительность одновременного чтения потоков? Возможно, используя разные API или изменяя параметры планировщика диска ОС.
Некоторые детали:
Файлы имеют порядок 2 ГБ каждый на машине с 2 ГБ ОЗУ. Для целей этого вопроса мы считаем, что они не кэшированы и не полностью дефрагментированы. Мы использовали инструменты дефрагментации и перезагрузились, чтобы убедиться в этом.
Мы не используем специальных API для чтения этих файлов. Поведение повторяется для различных стандартных API-интерфейсов, таких как CreateFile в Win32, fopen в C, std :: ifstream в C ++, FileInputStream в Java и т. Д.
Каждый поток вращается в цикле, вызывая функцию чтения. Мы меняли количество байтов, запрашиваемых у API на каждой итерации, от значений от 1 КБ до 128 МБ. Изменение этого значения не имело никакого эффекта, поэтому ясно, что количество, которое ОС физически читает после каждого поиска диска, не определяется этим числом. Это именно то, что и следовало ожидать.
Резкое различие между производительностью одного потока и двух потоков повторяется в Windows 2000, Windows XP (32-разрядной и 64-разрядной), Windows Server 2003, а также с аппаратным RAID5 и без него.