Ускорение ввода-вывода файлов: mmap () vs. read ()

У меня есть приложение Linux, которое читает 150-200 файлов (4-10 ГБ) параллельно. Каждый файл читается по очереди небольшими блоками переменного размера, обычно менее 2 КБ каждый.

В настоящее время мне необходимо поддерживать скорость чтения более 200 МБ / с из набора файлов. Диски справляются с этим отлично. Предполагаемая потребность составляет более 1 ГБ / с (что на данный момент недоступно для диска).

Мы реализовали две разные системы чтения, обе активно используют posix_advise : первая - это чтение mmap ed, в котором мы сопоставляем весь набор данных и читаем по запросу. Вторая - это система на основе read () / seek () .

Оба работают хорошо, но только в умеренных случаях, метод read () намного лучше управляет нашим общим файловым кешем и может хорошо работать с сотнями ГБ файлов, но сильно ограничен по скорости, mmap может предварительно кэшировать данные, что упрощает поддержание постоянной скорости передачи данных более 200 МБ / с, но не может работать с большими совокупными размерами наборов данных.

Итак, мой вопрос сводится к следующему:

A: Можно ли дополнительно оптимизировать ввод-вывод файла типа read () помимо вызовов posix_advise в Linux или после настройки disk scheduler, VMM и вызовы posix_advise настолько хороши, насколько мы можем ожидать?

B: Существуют ли систематические способы для mmap лучше справляться с очень большими отображаемыми данными?

Mmap-vs-reading-blocks представляет собой проблему, аналогичную той, над которой я работаю, и является хорошей отправной точкой для решения этой проблемы, наряду с обсуждениями в mmap-vs-read .

44
задан Community 23 May 2017 в 12:17
поделиться