如何禁用 NVMe 的 blk-mq 并使用 CFQ、deadline、noop?

如何禁用 NVMe 的 blk-mq 并使用 CFQ、deadline、noop?

出于测试目的,我想将CFQdeadline、 和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

相关内容