Почему io_submit (..., nr, ...) может отправлять меньше запросов, чем nr? - PullRequest
0 голосов
/ 29 января 2019

Я использую io_submit(..., nr, ...) с nr до 128, но обычно я получаю меньше запросов.

Согласно инструкции IO_SUBMIT (2) , это законно, но мне интересно: Зачем?Кроме того, есть ли способ узнать, какой запрос был отправлен сразу - без проверки io_getevents()?

Из руководства:

В случае успеха io_submit () возвращает числоотправлено iocbs (, которое может быть меньше nr, или 0, если nr равно нулю ).Для возврата при сбое см. ПРИМЕЧАНИЯ.

1 Ответ

0 голосов
/ 01 февраля 2019

Одной из возможных причин, по которой вы получаете меньше результатов, является то, что вы достигли лимита в 128 запросов.Может быть, вы позвонили io_submit со 128, а затем позвонили еще раз, прежде чем все 128 запросов были выполнены?См. Запись nr_requests в sysfs для вашего устройства, где указан предел количества запросов, которые оно готово обработать:

# cat /sys/block/sda/queue/nr_requests
128

Ваш код отслеживает количество ожидающих запросов и избегает попытокпозвоните io_submit с несколькими запросами, которые превысят это ограничение.

Теперь, возможно, это не та причина, по которой ваш звонок отправляет меньше запросов, чем вы просили.Если вы посмотрите на источник ядра, в fs/aio.c, вы увидите все состояния сбоя в __io_submit_one, которые могут вызвать короткий ответ.Могут быть проблемы с аргументами для одного из запросов, или, может быть, он не может выделить память слэба для kiocb и т. Д. Но, скорее всего, это aio_get_req, из-за которого nr_requests ограничивает глубину очереди.

Если вы посмотрите на SYSCALL_DEFINE3(io_submit... в том же файле, вы увидите, как легко определить, какие запросы не были отправлены.Это просто позиция в массиве, которую вы передали io_submit.Например, если io_submit возвращает 5, то вы знаете, что запросы, которые вы отправили в индексах массива 0-4, были отправлены.Ничего между 5 и nr - 1 не было отправлено.

...