如何启用和使用BFQ调度器?

如何启用和使用BFQ调度器?

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

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

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

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

答案1

我不在 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 和非 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 可能是比noop或调度程序更好的选择deadline,这也是将其用于 SSD 的好建议。

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

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

sudo udevadm control --reload
sudo udevadm trigger

答案2

延伸伟大罗穆洛·贝内代蒂 回答

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

琐事:

  • PROGRAM- 执行程序判断是否有匹配;如果程序成功返回,则该键为 true;如果没有给出绝对路径,则程序预计位于 /lib/udev 中。
  • $sys- sysfs 挂载点 ( /sys)。
  • $devpath- 设备的 devpath (/devices/pci/...)。

答案3

只是想与社区分享我成功实施上述建议的情况罗慕洛·贝内代蒂

我需要这样做,因为当我使用命令时

nice -n 17 tar cf - . | ( cd ${there} ; nice -n 17 tar xvpf - )

将分区(根设备上的 /DB001_F5)分区(单独设备上的 /site/DB002_F5)250 GB 镜像,我的系统无法使用。我的印象是好的命令应该处理这个问题......但事实并非如此!

实施后,切换应用程序、工作区或光标交互时,我有非常小的延迟(1/2 - 1 秒)。

实施前,延误是,没有开玩笑,分钟数量级!我无法立即获得鼠标或滚动按钮的响应,甚至认为这是交互式的,而不是“蜗牛邮件”交互。

另外值得注意的是,“调整”之前的传输大约需要 90 分钟。之后只用了48:

29.23user 
902.53system 
47:39.63elapsed 
32%CPU 
(0avgtext+0avgdata 3160maxresident)k

对于那些可能会问的人,我已经尝试了内核的低延迟版本,但这并没有提供改进交互式响应优先级的好处。

我的桌面配置 我的桌面是UbuntuMATE 20.04 LTS

Linux {myhost} 5.4.0-94-generic #106-Ubuntu SMP 
Thu Jan 6 23:58:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
4 GB RAM
Only HDDs

相关内容