在 Linux(使用 5.9)上,如果我的 NVMe 磁盘有max_sectors_kb == 2048
but logical_block_size == 512
,那是否仍然意味着如果我提交 2048KB 的写入,那么...
- 如果驱动器的内核写入队列已饱和,整个操作将失败 (
nr_requests == 256
)
或者
- 整个 2048KB 写入将被写入并且永远不会小于 2048KB?
我正在使用 io_uring 和O_DIRECT
.
io_uring
有自己的队列,您可以将其设置为大于 256 的数字。此外,entries
提交和完成队列与进行中请求的队列是分开的,因此您必须使AND饱和。io_uring_setup(2)
entries
nr_requests
维克多·斯图尔特@victorxstewart
@axboe如果您只提交大小为hw_sector_kb的文件IO,使用O_DIRECT,使用固定的操作,是否仍然可以获得短读或写?还是批量完成乱序?
Jens Axboe @axboe 回复 @victorxstewart
Short 通常不应该发生,out 或 order 完成可以(并且将)总是发生。
但是,您需要澄清您的问题。您实际上是在问“即使面对电源故障,O_DIRECT 也是原子的吗?” (即所有给定的 I/O 是否都已写入,如果没有,正在写入的区域是否与所有旧数据完全一样)?
在 io-uring 邮件列表线程[PATCH v3 RESEND] iomap: set REQ_NOWAIT 根据直接 IO 中的 IOCB_NOWAIT有一个警告,初始文件系统 I/O 可以分开并单独发送(更糟糕的是单独失败)如果设置了某些其他选项。
最好在 io_uring 邮件列表上更直接地询问 - http://vger.kernel.org/vger-lists.html#io-uring。