Блоки 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 для других подробных ответов.