Подтвердить что ты не робот

Самый быстрый способ читать много 300 байтов в случайном порядке по смещению файла из файла 2 ТБ?

У меня есть только 2 Тбайт только для чтения (не созданных однажды созданных файлов) в системе RAID 5 (4 x 7.2k @3TB).

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

Каков самый быстрый способ прочитать эти данные. Я не забочусь о цикле CPU, (lat) - это то, что считается. Поэтому, если возможно, я хочу воспользоваться NCQ жестких дисков.

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

  • Должен ли я объединять чтение файла в один поток?
  • Должен ли я держать файл открытым?
  • Если каждый поток (возможно, около 30) поддерживает одновременный просмотр каждого файла, что происходит с новыми потоками (с веб-сервера)?
  • Будет ли это помогать, если я буду ждать 100 мс и отсортировать мои показания с помощью смещений файлов (сначала самый низкий)?

Каков наилучший способ чтения данных? У вас есть опыт, советы, подсказки?

4b9b3361

Ответ 1

Оптимальное количество параллельных запросов сильно зависит от факторов вне вашего приложения (например, количество дисков = 4, глубина NCQ =?, глубина очереди драйверов =?...), поэтому вы можете использовать систему, которая может адаптироваться или быть адаптированным. Моя рекомендация:

  • Напишите все ваши запросы на чтение в очередь вместе с некоторыми метаданными, которые позволяют уведомлять запрашивающий поток
  • У N потоков нет очереди из этой очереди, синхронно читайте кусок, уведомляйте запрашивающий поток
  • Сделать N сменой времени выполнения
  • Поскольку процессор не является вашей проблемой, ваши рабочие потоки могут вычислять среднюю среднюю задержку (и/или максимальную, в зависимости от ваших потребностей).
  • Сдвиньте N вверх и вниз, пока не нажмете сладкую точку.

Почему синхронизация читается? Они имеют более низкую задержку, чем чтение ascync. Зачем тратить время ожидания на очередь? Хорошая реализация без блокировки начинается с задержки менее 10 нс, гораздо меньше, чем двух потоков.

Обновление: некоторые Q/A

Если прочитанные потоки сохраняют файлы открытыми? Да, определенно так.

Вы бы использовали FileStream с FileOptions.RandomAccess? Да

Вы пишете "синхронно читаете кусок". Означает ли это, что каждый прочитанный поток должен начинать читать фрагмент с диска, как только он отменяет порядок чтения фрагмента? Да, это то, что я имел в виду. Глубина запросов на чтение в очереди зависит от количества потоков.

Ответ 2

Диски "однопоточные", потому что есть только одна голова. Это не будет идти быстрее, независимо от того, сколько потоков вы используете... на самом деле больше потоков, вероятно, просто замедлит работу. Просто возьмите себе список и упорядочьте его в приложении.

Конечно, вы можете использовать много потоков, которые могли бы использовать NCQ, вероятно, более эффективно, но его размещение в приложении и использование одного потока должно работать лучше.

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

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

Ответ 3

Будет ReadFileScatter делать то, что вы хотите?