首页 > 解决方案 > 在 max_sectors_kb 处写入 IO

问题描述

在 Linux(使用 5.9)上,如果我的 NVMe 磁盘有max_sectors_kb == 2048but logical_block_size == 512,那是否仍然意味着如果我提交 2048KB 的写入,那么...

  1. 如果驱动器的内核写入队列已饱和,整个操作将失败 ( nr_requests == 256)

或者

  1. 整个 2048KB 写入将被写入并且永远不会小于 2048KB?

我正在使用 io_uring 和O_DIRECT.

标签: linuxionvme

解决方案


  1. io_uring有自己的队列,您可以将其设置为大于 256 的数字。此外,entries提交和完成队列与进行中请求的队列是分开的,因此您必须使AND饱和。io_uring_setup(2)entriesnr_requests
  2. 看起来有人在https://twitter.com/victorxstewart/status/1338303336370593792上向 Jens 提出了这个问题:

维克多·斯图尔特@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


推荐阅读