为配备NVMe SSD的主机选择正确的Linux I/O调度程序?

use*_*394 11 linux scheduler linux-kernel

我们正在为少数主机编写一个高度并发的C++软件,所有主机都配备了一个ST9500620NS作为系统驱动器和一个用于数据的Intel P3700 NVMe Gen3 PCIe SSD卡.为了更好地理解系统调试我的软件,我在系统中挖了两个(两个E5-2620 v2 @ 2.10GHz CPU,32GB RAM,运行CentOS 7.0)并且惊讶地发现以下内容:

[root@sc2u0n0 ~]# cat /sys/block/nvme0n1/queue/scheduler 
none
Run Code Online (Sandbox Code Playgroud)

这与我在选择正确的Linux I/O调度程序方面所学到的一切相矛盾,例如来自kernel.org上的官方文档.

我知道NVMe是一个新的孩子,所以现在我不会触及现有的调度程序设置.但我真的对安装人员输入的"无"感到奇怪.如果有人提示我可以在哪里找到更多信息或分享您的发现,我将不胜感激.到目前为止,我花了很多时间用谷歌搜索而没有找到任何具体内容.

she*_*idp 15

Sanne在评论中给出的答案是正确的:

"原因是NVMe绕过了调度程序.你没有使用"noop"实现:你没有使用调度程序."

noop与none不同,noop仍然执行块合并(除非你用nomerges禁用它)

如果使用nvme设备,或者在编译时或启动时启用"scsi_mod.use_blk_mq = Y",则会绕过传统请求队列及其关联的调度程序.

blk-mq的调度程序可能会在将来开发.


dus*_*uff 9

"none"(又名"noop")是用于此设备的正确调度程序.

I/O调度程序主要用于排队有限的较慢存储设备(例如,单机械硬盘驱动器) - I/O调度程序的目的是重新排序I/O请求以获得更早期服务的更重要的请求.对于内部队列非常大且服务速度非常快的设备(如PCIe SSD!),I/O调度程序对您没有任何好处; 你最好立即向设备提交所有请求.

  • 原因是NVMe绕过了调度程序.您没有使用"noop"实现:您没有使用调度程序. (9认同)
  • 从逻辑上讲,我明白你所说的。也许我应该说得更清楚——我在任何地方都没有看到这个选项“无”。我是否必须深入内核代码才能找到它,或者它是否记录在任何地方? (2认同)