![如何禁用 NVMe 的 blk-mq 并使用 CFQ、deadline、noop?](https://linux22.com/image/128356/%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8%20NVMe%20%E7%9A%84%20blk-mq%20%E5%B9%B6%E4%BD%BF%E7%94%A8%20CFQ%E3%80%81deadline%E3%80%81noop%EF%BC%9F.png)
出于测试目的,我想将CFQ
、deadline
、 和noop
用于 NVMe 驱动器。这可能吗?
我可以通过添加"scsi_mod.use_blk_mq=1"
到 grub 引导来将 blk-mq 用于 SATA SSD(请参阅:如何启用和使用BFQ调度器?)。
但尚未找到一种方法来对 NVMe 驱动器执行相反的操作,以允许它们使用非 blk-mq 调度程序。
答案1
/dev/sda <-- SCSI 设备
/dev/nvme0n1 <-- NVMe 设备
NVMe 驱动程序从内核版本 3.19 开始支持 blk-mq。它不允许通过使用 insmod 参数或 grub 中的内核引导选项来关闭 blk-mq。
$ modinfo -p nvme
use_threaded_interrupts: (int)
use_cmb_sqes:use controller's memory buffer for I/O SQes (bool)
max_host_mem_size_mb:Maximum Host Memory Buffer (HMB) size per controller (in MiB) (uint)
sgl_threshold:Use SGLs when average request segment size is larger or equal to this size. Use 0 to disable SGLs. (uint)
io_queue_depth:set io queue depth, should >= 2
您可以下载旧的 nvme 驱动程序并重新编译内核模块http://git.infradead.org/users/willy/linux-nvme.git如果你想禁用 blk-mq。然而,这却不是允许使用例如CFQ。这3.19中的相关变化解释说 NVMe 驱动程序之前“在其内部[实现]队列逻辑”,它没有使用单队列块层。此类块设备还有其他示例,例如 Linuxmdraid
设备。
以下来源当时是正确的,其中包括一些有用的注释和链接。然而它们已经过时了,因为它们是在引入 blk-mq IO 调度程序之前编写的,包括 BFQ(BFQ 被接受为 Linux 4.12 的一部分)。
https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq)
Linux 存储图来自https://www.thomas-krenn.com。
https://www.thomas-krenn.com/de/wikiDE/images/d/da/Linux-io-stack-diagram_v1.0.png