У меня есть приложение Linux, которое читает 150-200 файлов (4-10 ГБ) параллельно. Каждый файл считывается поочередно небольшими блоками с разным размером, обычно менее 2 тыс. Каждый.
Мне в настоящее время необходимо поддерживать скорость чтения более 200 МБ/с в сочетании с набором файлов. Диски отлично справляются с этим. Существует прогнозируемое требование более 1 ГБ/с (которое сейчас недоступно для диска).
Мы реализовали две разные системы чтения, которые сильно используют posix_advise
: сначала читается mmap
ed, в котором мы отображаем всю совокупность данных и читаем по требованию.
Вторая - система на основе read()
/seek()
.
Оба работают хорошо, но только для умеренных случаев, метод read()
намного лучше управляет нашим общим файловым кешем и может хорошо справляться с 100-граммовым объемом файлов в формате GB, но имеет ограниченную скорость, mmap
кеш-данных, что обеспечивает постоянную скорость передачи данных более 200 Мбайт/с, но не может справиться с большими размерами данных.
Итак, мой вопрос приходит к следующему:
A: Может ли read()
тип ввода/вывода файла больше оптимизироваться за пределами вызовов posix_advise
в Linux, или настроил планировщик дисков, вызовы VMM и posix_advise - это так хорошо, как мы можем ожидать?
B: Существуют ли систематические способы, с помощью которых mmap лучше справляется с очень большими отображаемыми данными?
Mmap-vs-reading-blocks аналогичная проблема с тем, что я работаю, и послужила хорошей отправной точкой для этой проблемы, а также обсуждения в mmap-vs-read.