linux - 为什么 io_submit(..., nr, ...) 提交的请求可能比 nr 少?

标签 linux solid-state-drive aio

我正在使用io_submit(..., nr, ...) nr 高达 128,但我通常收到的请求较少。

根据手册IO_SUBMIT(2) ,这是合法的,但我想知道:为什么?另外,有没有办法知道立即提交了哪个请求 - 无需检查 io_getevents()

来自手册:

On success, io_submit() returns the number of iocbs submitted (which may be less than nr, or 0 if nr is zero). For the failure return, see NOTES.

最佳答案

提交的结果较少的一个可能原因是您已达到 128 个未完成请求的限制。也许你打过io_submit 128,然后在所有128个请求完成之前再次调用它?请参阅nr_requests在您的设备的 sysfs 中输入其愿意处理的请求数量的限制:

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

由您的代码来跟踪有多少请求未完成并避免尝试调用 io_submit许多请求会使其超出此限制。

现在,这可能不是您的通话提交的请求少于您要求的请求的原因。如果你看the kernel source, in fs/aio.c ,您可以在 __io_submit_one 中看到所有失败情况这可能会引发简短的响应。其中一个请求可能存在参数问题,或者可能无法为kiocb分配slab内存。等等。但最有可能的是 aio_get_req由于nr_requests而失败队列深度限制。

如果你看SYSCALL_DEFINE3(io_submit...在同一个文件中,您可以看到很容易找出哪些请求未提交。它只是您传递给 io_submit 的数组中的位置。 。例如,如果 io_submit返回5 ,那么您就知道您在数组索引 0-4 中提交的请求已提交。 5 到 nr - 1 之间的任意值尚未提交。

关于linux - 为什么 io_submit(..., nr, ...) 提交的请求可能比 nr 少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424281/

相关文章:

c - 一个 nginx worker 进程是同时处理两个请求还是一个一个处理?

c - aio_write 是否总是写入整个缓冲区?

linux - 有没有办法让我自己的 sh 函数在 linux 终端中变为 "carry around",而不必在我连接的任何地方安装文件?

android - 无法连接到亚行

linux - 在linux中执行一个目录

performance - 为什么从多个 SSD 读取的吞吐量比从单个 SSD 读取的吞吐量低

database - 我是否使用 sqlite 破坏了我的磁盘?

mysql - 运行 mysqldump 的 Bash 脚本,以定期备份包含 1 天前创建的行的单个表

p2p - PCIe 设备之间的点对点通信?

Linux open(path, O_NONBLOCK | O_RDONLY | O_DIRECT) 阻止文件读取