如何启用和使用BFQ调度程序?


16

我刚刚使用ukuu(Ubuntu内核更新实用程序https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility)在Ubuntu 17.04上安装了Linux内核版本4.12 。

问题是,当我检查可用的I / O调度程序时,似乎找不到BFQ或Kyber I / O调度程序:

cat /sys/class/block/sda/queue/scheduler
> noop deadline [cfq]

那么如何使用此Linux版本中的新调度程序之一?

Answers:


22

我不在Ubuntu中,但是我在Fedora中所做的可能会为您提供帮助。

BFQ是blk-mq(多队列块IO队列机制)调度程序,因此您需要在启动时启用blk-mq,编辑/ etc / default / grub文件并将其添加scsi_mod.use_blk_mq=1到您的文件中GRUB_CMDLINE_LINUX,这就是我的grub文件,如下所示:一个例子:

GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=false
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="quiet vt.global_cursor_default=0 scsi_mod.use_blk_mq=1"
GRUB_DISABLE_RECOVERY="true"

之后,您必须更新grub。在Fedora上,我们必须使用sudo grub2-mkconfig -o /path/to/grub.cfg具体取决于启动方法。在Ubuntu上,您可以简单地运行:

sudo update-grub

重新启动,并且如果您得到此:

cat /sys/block/sda/queue/scheduler
[mq-deadline] none

也许您的内核是使用BFQ作为模块进行编译的,对于Kyber来说也是如此。

sudo modprobe bfq
sudo cat /sys/block/sda/queue/scheduler
[mq-deadline] bfq none

您可以在启动时通过添加一个/etc/modules-load.d/bfq.conf包含的文件来添加它bfq

重要的是要注意,启用blk_mq使得无法使用非blk_mq调度程序,因此您将失去noop cfq和non mq截止日期

显然,blk_mq调度系统不支持grub中的电梯标志,可以改用udev规则,并提供更精细的控制。

创建/etc/udev/rules.d/60-scheduler.rules它(如果不存在)并添加:

ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"

如此处所指出如果需要,您可以使用属性在udev规则中区分旋转(HDD)和非旋转(SSD)设备ATTR{queue/rotational}。请注意,BFQ开发人员Paolo Valente在LinuxCon Europe上指出,就低延迟保证而言,BFQ可能比noopor deadline调度程序更好,这也是将其用于SSD的一个很好的建议。

保罗的比较:https : //www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

保存它,然后重新加载并触发udev rules

sudo udevadm control --reload
sudo udevadm trigger

3
我只想指出:不要在您希望能够暂停运行的Linux <4.15的计算机上执行此操作;<4.15将挂起所有IO,因为它们缺少“安全的SCSI停顿”修复程序。
伊万·科兹克

您可能还会在内核4.14上遇到问题,其中启用blk-mq似乎在某些系统上加载内核之初就给了内核“哎呀”(这不是完全停止的恐慌,只是内核内部的空取消引用)。如果您不想找它,可能会想念它,但如果您偏执,则可能表示某些东西已损坏。
CR。

1
我建议使用稍微更准确的udev规则。当我尝试此处所示的设备时,udev尝试为名称与该模式匹配的某些设备设置调度程序,但这些设备不是可以使用BFQ调度程序的SCSI块设备。我最终ACTION=="add|change", SUBSYSTEM=="block", DRIVERS=="sd|sr", ATTR{queue/scheduler}!="bfq", ATTR{queue/scheduler}="bfq"得出的规则是:避免针对设备名称进行模式匹配,从而使匹配更加准确。它与分区设备不匹配,因为它们没有“ queue / scheduler”属性。
Dan Moulding

3
还要注意的重要一点是,内核4.15-4.16遭受了一个非常严重的错误,即在使用BFQ时更新驱动器的分区方案会导致完全的I / O锁定。cf .: lkml.org/lkml/2017/12/1/80
Glutanimate

1

扩展RomuloPBenedetti的答案

您可以使用PROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"udev规则测试bfq调度程序在特定设备上是否实际可用。DRIVERS=="sd|sr"如果有人忘记了,这将有效地替换并且不会触发scsi_mod.use_blk_mq=1

琐事:

  • PROGRAM-执行一个程序以确定是否匹配;如果程序成功返回,则该键为真;如果没有给出绝对路径,则该程序应位于/ lib / udev中。
  • $sys-sysfs挂载点(/sys)。
  • $devpath -设备的devpath(/ devices / pci / ...)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.