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