Блоки io_submit() до завершения предыдущей операции

Я использую ядро Linux AIO через libaio, и мне нужно отправить следующую операцию чтения, прежде чем предыдущая была завершена. Проблема в том, что io_submit() блокирует в течение некоторого времени и, как я могу вывести из интервала, он ожидает завершения предыдущей операции.

Я знаю, что могу поставить несколько операций в один io_submit(), но это не вариант для меня, потому что я не знаю, какой именно будет следующая операция чтения, когда уже пришло время отправить первую.

Это работает так только для меня или для всех? Во втором случае, могу ли я спросить, ищу ли я что-нибудь выполнимое, или я должен вернуться к резьбовой модели?

1 ответ

К сожалению, есть много причин, почему io_submit может блокировать в том числе:

  • Вы делаете буферизованный ввод / вывод
  • Вы выполняете ввод / вывод в файловую систему, и ваша отправка ставится в очередь за синхронной операцией.

Известно, что ext4 и AIO могут быть не лучшим сочетанием:

Блокировка во время io_submit на ext4, буферизованных операциях, доступе к сети, каналам и т. Д. [...] Доступ AIO к файлу в файловой системе, такой как ext4, частично поддерживается: если чтение метаданных требуется для поиска блока данных (т. Е. если метаданные еще не находятся в памяти), то вызов io_submit заблокирует чтение метаданных. Некоторые типы файлов с расширением записи полностью не поддерживаются и блокируются на все время операции.

(извлечение из документа, который назывался AIOUserGuide)

Посмотрите асинхронную задержку ввода-вывода io_submit в Ubuntu Linux для других подробных ответов.

Другие вопросы по тегам