Я пишу программу C для чтения данных с накопителя SSD, читая непосредственно из файла необработанного блочного устройства.
Я пытаюсь использовать Linux AIO (я говорю об API AIO Linux, то есть функции, предоставляемые linuxaio.h
, такие как io_submit(...)
и т.д., а не API POSIX AIO). Я открываю файл блока устройств с помощью флага O_DIRECT
, и я уверен, что я пишу в буферы, выровнены по размеру блока.
Я заметил, что Linux AIO значительно быстрее, чем использование синхронного ввода-вывода также с флагом O_DIRECT
.
То, что меня больше всего удивило, заключается в том, что пропускная способность, достигаемая путем выдачи множества небольших случайных чтений в несколько килобайт каждый с Linux AIO, значительно выше, чем пропускная способность, достигнутая при выполнении большого (последовательного) чтения нескольких МБ с использованием синхронного ввода /O и O_DIRECT
.
Итак, я хотел бы знать: как Linux AIO формирует это лучше, чем синхронный ввод-вывод? Что делает ядро при использовании AIO? Является ли ядро выполнять переупорядочение запроса? Использование Linux AIO приводит к большему использованию ЦП, чем при использовании синхронного ввода-вывода?
Большое спасибо заранее