![如何启用和使用BFQ调度器?](https://linux22.com/image/114881/%E5%A6%82%E4%BD%95%E5%90%AF%E7%94%A8%E5%92%8C%E4%BD%BF%E7%94%A8BFQ%E8%B0%83%E5%BA%A6%E5%99%A8%EF%BC%9F.png)
我刚刚使用 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