В какой момент асинхронное чтение дискового ввода-вывода более эффективно, чем синхронное?

22

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

Я заметил (и, возможно, я ошибаюсь), что при чтении очень маленьких файлов их асинхронное чтение занимает больше времени, чем синхронного (в частности, в .NET). Я предполагаю, что это связано с настройкой времени для таких вещей, как порты завершения ввода-вывода, потоки и т. Д.

Есть ли здесь какое-то эмпирическое правило? Или это зависит от системы и окружающей среды?

blesh
источник
Можете ли вы дать код, который вы используете для тестирования? Я думаю, что это может произойти только в том случае, если размер файла меньше, чем размер внутреннего буфера потокового считывателя. Но если вам нужно прочитать столько маленьких файлов, вы, вероятно, столкнетесь с другими проблемами с дисковым
вводом-выводом
Боюсь, у меня нет кода под рукой. Это то, с чем я столкнулся некоторое время назад, и это было в моей голове с тех пор. Код был в .NET и по сути был прямым File.ReadAllBytes () против FileStream.BeginRead () в цикле for
blesh
Когда кривые, которые представляют их эффективность, пересекаются, и асинхронный ввод-вывод выходит из пересечения с более высоким значением, чем кривая синхронизирующего ввода-вывода.
Томас Эдинг

Ответы:

14

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

Это будет зависеть от множества факторов. Они хранятся на вращающихся дисках, SSD или сетевом диске? Какой тип процессора вы используете? Сколько розеток / ядер? Вы работаете на виртуальной машине или голом металле? Вы используете древнюю ОС или современную?

Мартин С. Мартин
источник
1
Да, я так и понял. Думаю, я надеялся, что есть какое-то исследование, которое можно использовать как руководство или практическое правило.
плоть
9

Async имеет 3 основных преимущества:

  1. Это снижает загрузку процессора. Это может быть полезно, если вы также выполняете тяжелые для процессора операции с данными, которые вы только что прочитали.
  2. Использование некоторой асинхронной инфраструктуры позволяет легко парализовать код. Особенно, если вы читаете много файлов.
  3. Посылая несколько запросов на чтение и запись в ОС, ОС и HW могут переупорядочить эти операции, чтобы они выполнялись быстрее. SATA2 имеет такую ​​особенность.

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

Euphoric
источник
Обратите внимание на пункт 2, что он не будет ничего оптимизировать, если операция ввода / вывода является узким местом. Все иначе, если вы обращаетесь параллельно, через RAID или сеть, к файлам, которые находятся на разных дисках.
Арсений Мурзенко
5
Хм, у меня проблемы с пониманием того, что вы имеете в виду под № 1. Я бы сказал, что на практике все наоборот. Потому что в асинхронном случае вы меняете поток (ы) с blocked waiting for I/O(0% CPU) на continue normal processing(> 0% CPU).
Исак Саво
3

Это зависит

Нужно иметь в виду, насколько дорогим является переключение контекста между процессами. Node.JS спроектирован так, потому что он предполагает, что переключение контекста очень дорого, и в противном случае у вас будет много процессов, ожидающих в IE, что приведет к зависанию компьютера.

С другой стороны, Erlang делает переключение контекста процесса очень дешевым, поэтому все может быть синхронным, а время выполнения Erlang может отслеживать все это.

Итак, факторы, которые следует учитывать:

  • Стоимость операции переключения контекста
  • скорость диска для операций поиска
  • скорость диска для операций чтения
  • файлы в кеше

И я уверен, что я опускаю полдюжины факторов

Захари К
источник
2

Я не уверен, что есть какая-то конкретная «точка», но это имеет смысл, когда у вас работает много потоков, поскольку это позволяет вам совмещать ваш ввод / вывод с другой работой. Если у вас есть свободные потоки, работающие вхолостую, то асинхронное чтение не даст вам никакого преимущества. Асинхронный доступ к файлу дает какое-то преимущество только тогда, когда у вас заполнены рабочие очереди и ваш поток может с пользой выполнять другую работу вместо ожидания ввода-вывода.

TMN
источник
да, вот и весь смысл многопоточности!
Влад
1

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

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

кодировщик
источник