我正在使用io_submit(…,nr,…),nr最多为128但我通常会收到更少的请求。
根据手册IO_SUBMIT(2),这是合法的,但我想知道:为什么?还有,有办法知道……
提交结果较少的一个可能原因是您已达到128个未完成请求的限制。也许你打过电话 io_submit 用128,然后在所有128个请求完成之前再次调用它?见 nr_requests 在您的设备的sysfs中输入,以限制其愿意处理的请求数:
io_submit
nr_requests
# cat /sys/block/sda/queue/nr_requests 128
由您的代码来跟踪有多少请求未完成并避免尝试呼叫 io_submit 有许多要求推动它超过这个限制。
现在,这可能不是您呼叫提交的请求少于您提出的请求的原因。如果你看看 内核源码,在 fs/aio.c ,你可以看到所有的失败情况 __io_submit_one 这可能会引发短暂的反应。其中一个请求可能存在参数问题,或者它可能无法为其分配slab内存 kiocb 等等。但最有可能的是,它是 aio_get_req 那是因为那个失败了 nr_requests 队列深度限制。
fs/aio.c
__io_submit_one
kiocb
aio_get_req
如果你看看 SYSCALL_DEFINE3(io_submit... 在同一个文件中,您可以看到直接找出未提交的请求。它只是你交给的数组中的位置 io_submit 。例如,如果 io_submit 回报 5 ,那么您就知道您在数组索引0-4中提交的请求已经提交。 5和之间的任何东西 nr - 1 尚未提交。
SYSCALL_DEFINE3(io_submit...
5
nr - 1