У меня есть приложение 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 .