我以 root 用户身份使用以下命令为 NVMe SSD 设备启用 Linux 内核轮询。
# echo 1 > /sys/block/nvme2n1/queue/io_poll
我收到以下错误:bash: echo: write error: Invalid argument
操作系统详情:Ubuntu 16.04,Linux 内核 5.0.0+。
任何指针?
我以 root 用户身份使用以下命令为 NVMe SSD 设备启用 Linux 内核轮询。
# echo 1 > /sys/block/nvme2n1/queue/io_poll
我收到以下错误:bash: echo: write error: Invalid argument
操作系统详情:Ubuntu 16.04,Linux 内核 5.0.0+。
任何指针?
Nikhil在 Linux 块邮件列表中发布了“为 NVMe SSD 启用 io_poll 时出错” ,并得到了Keith Busch 的回复:
请务必在 nvme 驱动程序中打开轮询队列。默认情况下没有。[原文如此] 启用它们的内核参数是:
nvme.poll_queues=X
其中“X”是轮询队列的数量。我建议每个 CPU 插槽至少 1 个,但越多越好。
从Nikhil 的回复来看,在进行上述更改后,似乎io_poll
可以设置为 1。
对于上下文,浏览内核源代码可以看到5.0 内核引入了 NVMepoll_queues
选项(在Kernel Newbies 5.0 内核更改日志的存储部分也提到了这一点)。此外,5.0 提交默认poll_queues
为 0(在 2019 年末撰写本文时,我们目前已达到5.5-rc2,情况仍然如此)。
此外,看起来 Frank Ober(他以@FrankO 的身份发布了这个问题的答案)在“Polled io for Linux kernel 5.x” Linux 块邮件列表线程中询问了“为什么要进行更改”,并且还收到了来自基思:
原始轮询实现共享产生中断的资源。这会阻止它尽可能快地运行,因此现在使用专用的轮询队列。
您引用的这篇博客诞生于 4.x 内核时代,从那时起 io_uring IO 提交概念就出现在 5.x 内核时间范围内。
请阅读有关 io_uring 的文档: https ://kernel.dk/io_uring.pdf
您应该使用以下命令测试 Optane 媒体驱动器:ioengine=io_uring
如果您想使用 bio_poll 或不使用 hipri,请使用或不使用 hipri。
就传递给 fio 而言,这是应该起作用的东西:
[global]
direct=1
filename=/dev/nvme1n1
log_avg_msec=500
time_based
percentile_list=1:5:10:20:30:40:50:60:70:80:90:95:99:99.5:99.9:99.95:99.99:99.999:99.9999
[rand-read-4k-qd1]
runtime=120
bs=4K
iodepth=1
numjobs=1
cpus_allowed=0
ioengine=io_uring
hipri
rw=randread
uname -a
5.4.1-1.el8.elrepo.x86_64
CentOS 8
玩得开心,弗兰克·奥伯