![解决方案:改用BFQ调度器](https://linux22.com/image/1170503/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9A%E6%94%B9%E7%94%A8BFQ%E8%B0%83%E5%BA%A6%E5%99%A8.png)
Ubuntu 有ionice
,但据我所知,它什么也没做。
我怀疑这是因为Ubuntu 用 deadline 取代 cfq和截止日期不支持优先级。
还有什么方法可以在 Ubuntu 上实现优先 I/O 吗?
编辑:背景是,我有一个数据库还原,它很容易消耗我的所有 I/O,并使我的系统无法使用,直到它完成为止。我希望它仍然可用于其他任务。
答案1
这个答案可能对缺少 cfq 调度程序的 Ubuntu 20.04 有帮助: https://askubuntu.com/a/1350605
从那个答案来看:
Ubuntu 20.04 使用内核 5.4(带有 HWE:5.8),其中仅mq-deadline
编译了调度程序。
您可以通过查看来检查/sys/block/sda/queue/scheduler
。活动调度程序周围有方括号。如果内核中编译了其他调度程序,它们也会显示出来。
例子:
# cat /sys/block/sda/queue/scheduler
[mq-deadline] none
# uname -r
5.4.0-26-generic
调度程序目前mq-deadline
不支持使用的机制,请参阅:ionice
https://unix.stackexchange.com/a/160081/27458
解决方案:改用BFQ调度器
调度bfq
程序不需要在内核中编译,而是可以使用内核模块随后加载。
切换到BFQ调度器:
# modprobe "bfq"
# echo "bfq" > /sys/block/sda/queue/scheduler
# echo "bfq" > /etc/modules-load.d/bfq.conf
# echo 'ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"' > /etc/udev/rules.d/60-scheduler.rules
查看:
# cat /sys/block/sda/queue/scheduler
mq-deadline [bfq] none
重新启动并再次检查可能也是个好主意。
BFQ 在“虚拟”内核上不可用
如果您使用的是“虚拟”内核,您可能无法使用 bfq
内核模块,因为它不包含该linux-modules-extra-5.xxx
软件包。
您可以通过切换到“generic-HWE”内核来解决这个问题:
# sudo apt-get install linux-generic-hwe-20.04 linux-tools-generic-hwe-20.04
# reboot
重启后你应该进入 kernel 5.8.0-xxx-generic
。你可以检查一下:
# uname -r
5.8.0-59-generic
现在您可以应用上述解决方案。
替代解决方案:Systemd 范围
如果您不想切换 IO 调度程序,则可以使用具有较低 IO 权重的 Systemd 范围。
创建一个文件/usr/local/bin/mh_ionice
,内容如下:
#!/bin/bash
if (( EUID == 0 )); then USERMODE=''; else USERMODE='--user'; fi
systemd-run \
--collect \
--quiet \
--scope \
$USERMODE \
--nice=19 \
--property="IOAccounting=yes" \
--property="IOWeight=1" \
"$@"
使其可执行:
chmod 755 /usr/local/bin/mh_ionice
现在你可以运行:
mh_ionice [heavy_command] [arg] [arg] [arg]
答案2
您必须将您的调度程序从 更改deadline
为cfq
。
您可以通过每个块设备和非永久性的方式执行此操作
sudo echo cfq > /sys/block/<blockdevice>/queue
或者对于整个系统,通过向 grub 命令行选项grub
添加参数来永久保留。elevator=cfq
这是一篇很棒的文章解释你如何能做到这一点。
这种改变的缺点是什么其他地方有更好的介绍。
TL;DR 是
从测试结果来看,每个调度器都各有优势。CFQ 调度器适用于需要平衡 I/O 访问且不需要进程优先级的系统。Deadline 调度器在读取密集型工作上表现更佳。Noop 适用于云端或虚拟机管理程序上的系统。BFQ 在交互式用例场景中表现更佳。Noop 是最简单的调度器,被认为具有针对 SSD 块设备进行优化的新实现的潜力。